參考帖子:
示例不錯: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;
}