参考帖子:
示例不错:https://blog.csdn.net/zy010101/article/details/83690667
文字不错:https://blog.csdn.net/qq_38410730/article/details/81193118
先贴上代码
1- fork创建进程。子进程从父进程复制。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
int num = 3;
pid_t pid = 0;
printf("func:%s enter\n",__func__);
printf("func:%s(%d) before fork num=%d\n",__func__,__LINE__,num);
pid = fork(); //创建一个子进程,fork()函数没有参数。
printf("func:%s(%d) after fork num=%d\n",__func__,__LINE__,num);
printf("pid is %d\n",getpid()); //获取进程的pid
if (0 < pid) //父进程得到的pid大于0,这段代码是父进程中执行的
{
num++;
printf("I am parent!,num is %d\n",num);
}
else if(0 == pid) //子进程得到的返回值是0,这段代码在子进程中执行
{
num--;
printf("I am son!,num is %d\n",num);
}
else //创建进程失败
{
//有两种情况会失败:
//1.进程数目达到OS的最大值
//2.进程创建时内存不够了。
printf("fork error!\n");
exit(-1);
}
printf("func:%s exit\n",__func__);
return 0;
}
2- vfork创建进程。父子进程共享地址空间。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
int num = 3;
pid_t pid = 0;
printf("func:%s enter\n",__func__);
printf("func:%s(%d) before fork num=%d\n",__func__,__LINE__,num);
pid = vfork(); //创建一个子进程,fork()函数没有参数。
printf("func:%s(%d) after fork num=%d\n",__func__,__LINE__,num);
printf("pid is %d\n",getpid()); //获取进程的pid
if (0 < pid) //父进程得到的pid大于0,这段代码是父进程中执行的
{
num++;
printf("I am parent!,num is %d\n",num);
}
else if(0 == pid) //子进程得到的返回值是0,这段代码在子进程中执行
{
sleep(1);
num--;
printf("I am son!,num is %d\n",num);
exit(0);
}
else //创建进程失败
{
//有两种情况会失败:
//1.进程数目达到OS的最大值
//2.进程创建时内存不够了。
printf("fork error!\n");
exit(-1);
}
printf("func:%s exit\n",__func__);
return 0;
}