fork函数是linux中创建进程的函数,linux创建进程只有用fork,别无他法。我自己写代码fork用的不多,对它的一些细节还不是清楚,今天抽空研究了下fork,把它的一些关键点总结一下,以后用到了自己也好有个参考。

       1)fork函数会在父进程中创建子进程,子进程的堆,栈,数据段,PC指针都是从父进程中复制过来的,和父进程是独立的,但是内容是一致的。代码段子进程和父进程是共享的

       2)fork()的返回值可能为-1,0,和一个正数。-1表示fork()调用失败,0表示返回子进程执行结果,正数表示返回父进程结果(正数即为子进程ID)。

      3)在fork的时候,缓存被复制到了子进程空间。这点可以详细参考http://coolshell.cn/articles/7965.html,我觉得这个帖子写的很好,很详细。

          在进程中调用exec函数启动新的程序。exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数。所以只要掌握了execve用法就可以了。这里我写了个例子,说明execve用法。

/*

*  execve.c

*/

#include<unistd.h>
int main()
{

   char * argv[ ]={“./test”,”test_sample”,(char *)0};
   char * envp[ ]={0};
   execve(“./test”,argv,envp);

   return 0;
}

/*

* test.c

*/

#include <stdio.h>
int main(int narg,char **args)
{

   if(narg != 2)

   {

       printf(“error,the input parameter must be one!\n”);
       return -1;
   }
   char *str = args[1];
   printf(“the input parameter is %s\n”,str);
   return 0;
}

cc -g -o test test.c

生成test应用程序

然后

cc -g -o execve execve.c

生成execve应用程序

执行./execve即可调用test应用,输出

test_sample