学习笔记:linuxc第七章—进程控制 下篇

我们知道,父子进程终止的先后顺序不同会产生不同的结果,下面,我简单说明一下几个容易混淆的概念。
1.孤儿进程:如果一个子进程的父进程先于子进程结束,那么子进程就会成为孤儿进程,它会由init进程收养,成为init进程的子进程。
2.僵尸进程:当子进程先于父进程终止,而父进程又没有调用wait函数等待子进程结束,子进程就会进入僵死状态,并且会一直保持下去,除非系统重启。此时,该子进程就是一个僵尸进程。
如果子进程先父进程退出,并且父进程调用了wait或者waitpid函数,那么子进程既不会变成孤儿进程, 也不会变成僵尸进程。
这两个函数的声明如下:

pid_t wait(int *statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);
/*statloc所指向的变量存放子进程的退出码,pid指明要等待的子进程的PID
options 参数允许用户改变waitpid的行为*/

下面是等待进程的处理实例:

int main(void)
{
    pid_t pid;
    char *msg;
    int k;
    int exit_code;

    printf("study how to get exit code\n");
    pid=fork();
    switch(pid){
        case 0:
            msg="child process is running";
            k=5;
            exit_code=37;
            break;
        case -1:
            perror("process creation failed\n");
            exit(-1);
        default:
            exit_code=0;
            break;
    }
    if(pid != 0){
        int stat_val;
        pid_t child_pid;
        child_pid=wait(&stat_val);

        printf("child process has exited ,pid=%d\n", child_pid);
        if(WIFEXITED(stat_val)){
           printf("child exited with code:%d\n", WEXITSTATUS(stat_val));
        }
        else{
            printf("child exit abnormally\n");
        }
    }
    else{
        while(k-- >0){
            puts(msg);
            sleep(1);
        }
    }
    exit(exit_code);
}

父进程调用wait函数后被挂起等待,暂停执行,直到到它的一个子进程结束为止。wait等待第一个终止的子进程。而waitpid则可以指定等待特定的子进程。输入命令 ps aux 可以看到等待时的父进程状态为S.
下面说明本章的难点:创建守护进程
1.概念:守护进程是指后台运行的、没有控制终端与之相连的进程。
控制终端:在linux中,每一个系统与用户进行交流的界面称为终端,每一个从终端开始运行的进程都会依附与这个终端,这个终端就叫做这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。
守护进程没有控制终端与之相连,也就是说,守护进程突破控制终端的限制,它从被执行开始运转,直到整个系统关闭时才退出。
2.编写守护进程的步骤:

让进程在后台执行   /*调用fork产生一个子进程,然后使父进程退出*/
调用setsid创建一个新对话期 /*setsid调用成功后,进程成为新的会话组长和进程组长*/
禁止进程新打开终端/*再次通过fork创建新的子进程,使调用fork的进程退出(不是组长)*/
关闭不再需要的文件描述符/*先得到最高文件描述符值然后关闭从0到最高描述符值的文件*/
将当前目录更改为根目录
将文件创建时使用的屏蔽字设置为0/*避免从父进程继承的拒绝某些许可权,使用umask(0)*/
处理SIGCHLD  /*这一步不是必须的,但在服务器进程往往在请求到来时生成子进程处理请求,将SIGCHLD信号的操作设为SIG_IGN,使得子进程结束时不会产生僵尸进程。*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值