linux下进程-进程组-会话之间的关系-代码说明一切
2011-12-12 16:20
447 查看
1. 每个进程组有1个或多个进程组成,可能有一个进程组长,也可能没有
2. 每个会话有1个或多个进程组组成,可能有一个领头进程,也可能没有
好,贴上测试代码:
复制代码
得到文件 /root/proc.txt
内容如下:
复制代码
第一行即为从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
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
相关文章推荐
- linux下进程-进程组-会话之间的关系-代码说明一切
- Linux进程,进程组,会话之间关系
- 2进程之间的关系:进程组,会话,守护进程
- Linux进程间关系之进程组,作业,会话与作业控制。
- 进程 、进程组、会话、控制终端之间的关系 (转载 http://blog.csdn.net/yh1548503342/article/details/41891047)
- 进程 、进程组、会话、控制终端之间的关系
- 进程 、进程组、会话、控制终端之间的关系
- 进程 、进程组、会话、控制终端之间的关系
- 进程 、进程组、会话、控制终端之间的关系
- linux内核之进程的基本概念(进程,进程组,会话关系)
- Linux-进程、进程组、作业、会话、控制终端详解
- Linux--进程组、会话、守护进程
- Linux--进程组、会话、守护进程
- linux多进程——进程组与会话、守护进程、信号通信
- pstree命令_Linux pstree 命令用法详解:以树状图的方式展现进程之间的派生关系
- Linux 的进程组、会话、守护进程
- Linux--进程组、会话、守护进程(转)
- Linux 的进程组、会话、守护进程
- Linux--进程组、会话、守护进程
- linux内存与java进程之间的关系