fork()的的使用见上一期
linux C fork()和系统调用文件-CSDN博客
简单说一下fork的作用就是创造一个子进程和当前进程一起执行下面的代码
pid_t fork(void)
execve的作用为:让当前进程内容销毁大部分,重新执行一个程序
int execve (const char *__path, char *const __argv[],
char *const __envp[])
参数用法
__path :待执行文件路径,可以通过pwd查询当前路径,再加上文件名
*__argv[] :一个由字符串指针组成的数组,该数组最后一位必须是NULL
(猜想用于结束,类似于 while(argv != NULL))
*__envp[] : 环境字符串组,可以通过echo $PATH获取当前终端的环境,字符串格式为格式为"name=value" 和__argv类似,数组结尾必须是NULL
写以下两个程序
子程序:
#include "stdio.h"
#include "unistd.h"
#include "stdlib.h"//system头文件
#include "fcntl.h"//pid_t 定义头文件
int main(int argc, char const *argv[])
{
//打印父子id和输入的数据
printf("in son program, ppid = %d , pid = %d\n",getppid(),getpid());
printf("PATH = ");//打印接收到的环境
system("echo $PATH");
printf("para num = %d\n",argc);
for(int i = 0;i < argc; i++)
{
printf("%s\n",argv[i]);
}
return 0;
}
父程序:
#include "stdio.h"
#include "unistd.h"
#include "fcntl.h"//pid_t 定义头文件
int main(int argc, char const *argv[])
{
//创建子进程,现在开始下面代码父子进程都会执行
pid_t spid = fork();
//换成自己的子进程文件路径
char path[] = "/home/zsy/Desktop/linux/son";
//执行的指令
char *argv1[] = {"para1" ,"para2", NULL};
//环境
char *encv[] = {
"PATH=/usr/bin",//一个环境
NULL
};
if(spid == 0)//子进程的pid变量值为0,通过这个来分支父子进程
{
execve(path, argv1, encv);
//可以获取返回值来获取执行结果
}
else//该进程执行
{
sleep(1);//停止一下免得该进程执行完了没法看见子程序的父进程
//打印父子id和输入的数据
printf("in father program,pid = %d\n",getpid());
}
return 0;
}
编译子程序,再编译父程序,并且运行父程序
执行结果
可以看到环境和参数都被输入到子程序中,由父程序调用,且父程序也执行了自己的程序