zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    毕业设计:文献参考(六)
    毕业设计:文献参考(五)
    稀疏数组搜索(leetcode)
    寻找重复数(leetcode)
    联通网络的操作次数(leetcode)
    Flutter 混合开发基础
    浅谈 Serverless 开发和应用
    基于 Qt Quick Plugin 快速构建桌面端跨平台组件
    Android 设备音视频兼容性适配
    RTC 系统音频弱网对抗技术发展与实践
  • 原文地址:https://www.cnblogs.com/nysanier/p/1979321.html
Copyright © 2011-2022 走看看