linux进程间的关系

1. 每个进程组有1个或多个进程组成,可能有一个进程组长,也可能没有

2. 每个会话有1个或多个进程组组成,可能有一个领头进程,也可能没有

好,贴上测试代码:

    
    
1 #include < stdio.h >
2 #include < unistd.h >
3 #include < stdlib.h >
4 #include < sys / param.h >
5 #include < sys / stat.h >
6 #include < sys / types.h >
7 #include < fcntl.h >
8 #include < signal.h >
9
10   int main( int argc, char * argv[]) {
11 file * fp = fopen( " /root/proc.txt " , " a " );
12 int pid;
13
14 fprintf(fp, " pid = %d, ppid = %d, sid = %d, pgrp = %d/n " , getpid(), getppid(), getsid( 0 ), getpgrp()); // 前台进程
15   fflush(fp);
16
17 // 1.转变为后台进程
18   if ((pid = fork()) == - 1 ) exit( 1 );
19 if (pid != 0 ) exit( 0 ); // 父进程(前台进程)退出
20   fprintf(fp, " pid = %d, ppid = %d, sid = %d, pgrp = %d/n " , getpid(), getppid(), getsid( 0 ), getpgrp()); // 后台进程
21   fflush(fp);
22
23 // 2.离开原先的进程组,会话
24   if (setsid() == - 1 ) exit( 1 ); // 开启一个新会话
25   fprintf(fp, " pid = %d, ppid = %d, sid = %d, pgrp = %d/n " , getpid(), getppid(), getsid( 0 ), getpgrp()); // 新会话领头进程
26   fflush(fp);
27
28 // 3.禁止再次打开控制终端
29   if ((pid = fork()) == - 1 ) exit( 1 );
30 if (pid != 0 ) exit( 0 ); // 父进程(会话领头进程)退出
31   fprintf(fp, " pid = %d, ppid = %d, sid = %d, pgrp = %d/n " , getpid(), getppid(), getsid( 0 ), getpgrp()); // 新会话非领头进程
32   fflush(fp);
33
34 fclose(fp);
35
36 return 0 ;
37 }

得到文件 /root/proc.txt

内容如下:

    
    
1 pid = 9002 , ppid = 8944 , sid = 8944 , pgrp = 9002 // parent
2   pid = 9003 , ppid = 1 , sid = 8944 , pgrp = 9002 // fork[1]
3 pid = 9003 , ppid = 1 , sid = 9003 , pgrp = 9003 // setsid()
4 pid = 9004 , ppid = 1 , sid = 9003 , pgrp = 9003 // fork[2]

第一行即为从bash中执行的父进程,pid=9002,ppid即为bash的pid,sid=bash的pid,每个从bash中启动的进程为一个单独的进程组

第二行是parent fork出来的子进程,姑且叫它fork[1],因为父进程的exit(0),那么它的ppid=1(init进程pid)

第三行由于setsid的执行,是fork[1]创建了一个新的会话,它也成为了会话中的一个进程的进程组长,同时是会话领头进程,pid=sid=pgrp=9003

第四行是第二次fork后的结果,意味着新会话9003的领头进程的结束并没有有使其他的进程结束,9004的sid=pgrp=9003

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值