创建子进程及回收子进程的两种方法

109 篇文章 12 订阅
72 篇文章 19 订阅

方法一:

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()函数配合使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值