方法一:
1、使用fork函数,参考该文//没有对子进程回收。
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
pid_t pid;
for(int i = 0;i<2;i++)
{
pid = fork();
if(pid<0)
{
perror("fork()");
}else if(pid == 0){
i += 100;
printf("child,i=%d\n",i); //子进程
exit(0);//很重要一定要加上
}else{
printf("father\n"); //父进程
}
}
return 0;
}
以上代码实现功能,父进程不断创建子进程,同时执行i++操作,子进程执行任务。
注意:1)子进程运行结束后,一定要exit,退出。
2)父进程执行i++,后,再执行的第二次fork,此时i的值为1。
2、僵尸态
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
pid_t pid;
for(int i = 0;i<2;i++)
{
pid = fork();
if(pid<0)
{
perror("fork()");
}else if(pid == 0){
i += 100;
printf("child,i=%d\n",i); //子进程
exit(0);//很重要一定要加上
}else{
printf("father\n"); //父进程
}
}
sleep(1000);///添加此条代码,会使子进程先退出,成为僵尸进程
return 0;
}
如上图,待父进程sleep结束后,僵尸态的子进程成为孤儿进程,从而被init接管,init待孤儿进程退出后,释放资源。
僵尸进程短时间 存在是正常的。
3、回收子进程操作//这样程序才完整
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <wait.h>
int main()
{
pid_t pid;
for(int i = 0;i<2;i++)
{
pid = fork();
if(pid<0)
{
perror("fork()");
}else if(pid == 0){
i += 100;
printf("child,i=%d\n",i); //子进程
exit(0);//很重要一定要加上
}else{
printf("father\n"); //父进程
}
}
//int status;
for(int i = 0;i<2;i++)//创建了几个子进程,就要wait几次!!!!!
{
//wait(&status);
wait(NULL);
}
return 0;
}
或者参考该文
注意:wait()调用一次,只能回收一个子进程!!!!!!!!
方法二、使用singnal(SIGCHLD,signal_hander);
和 posix_spwan()函数配合使用。