现在的位置: 首页 > 综合 > 正文

进程组/线程组/会话

2018年03月21日 ⁄ 综合 ⁄ 共 3567字 ⁄ 字号 评论关闭

可以参看UNIX环境高级编程的相关章节。

为了搞清楚进程组之间的关系,我们做如下的实验:

编写程序:

  1. /*test.c*/  
  2. #include "../include/apue.h"  
  3.   
  4. void main() {  
  5.   pid_t pid;  
  6.   char *args[] = {"/bin/echo""Hello""World!", NULL };  
  7.   if((pid = fork()) < 0)   
  8.     err_sys("fail to fork!");  
  9.   else if(pid == 0) {  
  10.         execve("./test1", args, NULL);  
  11.   }  
  12.  /* 
  13.   if((pid = fork()) < 0)  
  14.     err_sys("fail to fork!"); 
  15.   if(pid == 0) { 
  16.         execve("./test2", NULL, NULL); 
  17.    } 
  18. */  
  19.    while(1) { };  
  20. }  
  21.   
  22. /*test1.c*/  
  23. #include <stdio.h>  
  24. int main(int args, char* argv[]) {  
  25.     char s[5] = "ABCD";  
  26.     while(1) {}  
  27.     return;  
  28. }  
  29.   
  30. /* in test2.c */  
  31. #include <stdio.h>  
  32. #include <stdlib.h>  
  33.   
  34. int main()  
  35. {  
  36.         pid_t   pid;  
  37.         pid = fork();  
  38.         if (pid <0) {  
  39.                 printf("fork err\n");  
  40.                 exit(-1);  
  41.         } else if (pid == 0) {  
  42.                 /* in child process */  
  43.             execve("./test3", NULL, NULL);  
  44.   
  45.         }   
  46.     while(1) {}  
  47. }  
  48.   
  49. /*test3.c*/  
  50. #include <stdio.h>  
  51. void main() {  
  52.   
  53.     while(1) {  
  54.         //printf("test3\n\n");  
  55.     }  
  56. }  

实验一:

编写shell文件,shell文件的作用是同时启动两个进程:

#!/bin/bash

./test | ./test2    

$ps -ejH

  PID  PGID   SID TTY          TIME CMD

 3888  3888  3888 pts/4    00:00:00     bash
 4961  4961  3888 pts/4    00:00:00       ps
 4394  4394  4394 pts/0    00:00:00     bash
 4957  4957  4394 pts/0    00:00:00       test
 4959  4957  4394 pts/0    00:00:00         test1
 4958  4957  4394 pts/0    00:00:00       test2
 4960  4957  4394 pts/0    00:00:00         test3

$pstree -H 4394

  |-gnome-terminal

  |   |-bash
  |   |   `-pstree -all
  |   |-bash
  |   |-bash
  |   |   |-test
  |   |   |   `-test1 Hello World!
  |   |   `-test2
  |   |       `-(test3)
  |   |-gnome-pty-helpe
  |   `-3*[{gnome-terminal}]

结果分析:

PID为4394的进程是我开启的用于运行程序的终端,也就是一个会话(session),其ID为4394。在该session下运行的程序的SID当然都是

4394.我们同时运行了两个进程test和test2,其PID分别为4057和4958,其组ID都是4057。看到,test和test2同属一个进程组,其组ID为该

组创建的第一个进程的ID,即test的ID。由test和test2创建的子进程的组ID同样为4057。

实验二:

$./test  &    //在后台运行test

$./test2 &   //在后台运行test2

  PID  PGID   SID TTY          TIME CMD

 2697  1501  1501 ?        00:08:20   gnome-terminal
 2705  1501  1501 ?        00:00:00     gnome-pty-helpe
 3050  3050  3050 pts/1    00:00:00     bash
 3888  3888  3888 pts/4    00:00:00     bash
 5294  5294  3888 pts/4    00:00:00       ps
 4394  4394  4394 pts/0    00:00:00     bash
 5288  5288  4394 pts/0    00:00:05       test
 5289  5288  4394 pts/0    00:00:04         test1
 5290  5290  4394 pts/0    00:00:00       test2
 5291  5290  4394 pts/0    00:00:01         test3

$pstree -all

  |-gnome-terminal
  |   |-bash
  |   |   `-pstree -all
  |   |-bash
  |   |-bash
  |   |   |-test
  |   |   |   `-test1 Hello World!
  |   |   `-test2
  |   |       `-(test3)
  |   |-gnome-pty-helpe
  |   `-3*[{gnome-terminal}]

实验结果分析:

我们先后运行了两个进程,可以看到其组ID是不一致的。

实验三:

修改test.c源程序,取消对注释部分的注释,重新编译

$gcc -g -o test test.c

$./test

   PID  PGID   SID TTY          TIME CMD

 2697  1501  1501 ?        00:08:20   gnome-terminal
 2705  1501  1501 ?        00:00:00     gnome-pty-helpe
 3050  3050  3050 pts/1    00:00:00     bash
 3888  3888  3888 pts/4    00:00:00     bash
 5397  5397  3888 pts/4    00:00:00       ps
 4394  4394  4394 pts/0    00:00:00     bash
 5393  5393  4394 pts/0    00:00:01       test
 5394  5393  4394 pts/0    00:00:01         test1
 5395  5393  4394 pts/0    00:00:00         test2
 5396  5393  4394 pts/0    00:00:01           test3

  |-gnome-keyring-d --daemonize --login
  |   `-4*[{gnome-keyring-}]
  |-gnome-screensav --no-daemon
  |   `-2*[{gnome-screensa}]
  |-gnome-terminal
  |   |-bash
  |   |   `-pstree -all
  |   |-bash
  |   |-bash
  |   |   `-test
  |   |       |-test1 Hello World!
  |   |       `-test2 Hello World!
  |   |           `-(test3)
  |   |-gnome-pty-helpe
  |   `-3*[{gnome-terminal}]
 

结果分析:

由进程树可以看到test3是test2的子进程,test2是test的子进程。其组ID都是test的PID。

现在,我们先告一段落,过段时间我们通过杀死进程来进一步分析进程/进程组,线程/线程组之间的关系。

抱歉!评论已关闭.