《unix高级环境编程》进程关系——会话

会话

       会话是一个或多个进程组的集合,通常是由shell的管道线将几个进程编成一组;会话首进程是新建会话时,会话中的唯一进程,其进程ID等于会话ID;

       下面是新建会话和获取会话首进程的进程组ID的函数:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 会话 */  
  2.   
  3. /* 
  4.  * 函数功能:建立一个新会话; 
  5.  * 返回值:若成功则返回进程组ID,若出错则返回-1; 
  6.  * 函数原型: 
  7.  */  
  8. #include <unistd.h>  
  9.   
  10. pid_t setsid(void);  
  11.   
  12. /* 
  13.  * 函数功能:获取会话首进程的进程组ID; 
  14.  * 返回值:若成功则返回会话首进程的进程组ID,若出错则返回-1; 
  15.  * 函数原型: 
  16.  */  
  17. pid_t getsid(pid_t pid);  
  18. /* 
  19.  * 若pid = 0,则返回调用进程的会话首进程的进程组ID; 
  20.  */  

       若调用 setsid 函数的进程不是一个进程组组长,则此函数就会创建一个新会话,结果将发生下面三件事:

  1. 该进程变成新会话首进程(session leader)。(会话首进程是创建该会话的进程)此时,该进程是新会话中的唯一进程。
  2. 该进程称为一个新进程组的组长进程,新进程组ID是该调用进程的进程ID。
  3. 该进程没有控制终端,如果在调用setsid之前该进程有一个控制终端,那么这种联系也会被中断。
        若该调用进程已经是一个进程组的组长,则此函数返回出错。为了保证不会发生这种情况,通常先调用fork,然后使其父进程终止,则子进程则继续。因为子进程继承了父进程的进程组ID,而其进程ID是新分配的,保证了子进程不会是一个进程组的组长。
测试程序:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include "apue.h"  
  2. #include <sys/types.h>  
  3.   
  4. int main(void)  
  5. {  
  6.     pid_t pid;  
  7.     if((pid = fork()) < 0)  
  8.         err_sys("fork error");  
  9.     else if(0 == pid)  
  10.     {  
  11.         setsid();  
  12.         printf("child process pid is %d\n",getpid());  
  13.         printf("group id is %d\n",getpgid(0));  
  14.         printf("My father id is %d\n",getppid());  
  15.         printf("My session id is %d\n",getsid(0));  
  16.     }  
  17.     else  
  18.     {  
  19.         printf("parent process pid is %d\n",getpid());  
  20.         printf("group id is %d\n",getpgid(0));  
  21.         printf("My father id is %d\n",getppid());  
  22.         printf("My session id is %d\n",getsid(0));  
  23.     }  
  24. }  
输出结果:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. parent process pid is 4854  
  2. group id is 4854  
  3. My father id is 2982  
  4. My session id is 2982  
  5. child process pid is 4855  
  6. group id is 4855  
  7. My father id is 1  
  8. My session id is 4855  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值