zoukankan      html  css  js  c++  java
  • 进程关系之会话

    会话(session)是一个或多个进程组的集合

    例如,可以具有图9-6中所示的安排。其中,在一个会话中有三个进程组。

    0_13182373977lLL.gif

                                           图9-6 进程组和会话中的进程安排

    通常是由shell的管道线将几个进程变成一组的。例如,图9-6中的安排可能是由下列形式的shell命令形成的:

    proc1 | proc2 &

    proc3 | proc4 | proc5

    进程调用setsid函数建立一个新会话:

    #include <unistd.h>
    pid_t setsid(void);
    返回值:若成功则返回进程组ID,若出错则返回-1

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

    (1)该进程变成新会话首进程(session leader)。(会话首进程是创建该会话的进程。)此时,该进程是新会话中唯一的进程。

    (2)该进程成为一个新进程组的组长进程。新进程组ID是该调用进程的进程ID。

    (3)该进程没有控制终端。如果在调用setsid之前该进程有一个控制终端,那么这种联系也会被中断。

    如果该进程已经是一个进程组的组长,则此函数返回出错。为了保证不会发生这种情况,通常先调用fork,然后使其父进程终止,而子进程则继续。因为子进程继承了父进程的进程组ID,而其进程ID则是新分配的,两者不可能相等。所以这就保证了子进程不会是一个进程组的组长。

    Single UNIX Specification只包括“会话首进程”,而没有类似于“进程ID”和“进程组ID”的会话ID。显然,会话首进程是具有唯一进程ID的单个进程,所以可以将会话首进程的进程ID视为会话ID。

    getsid函数返回会话首进程的进程组ID。

    #include <unistd.h>
    pid_t getsid(pid_t pid);
    返回值:若成功则返回会话首进程的进程组ID,若出错则返回-1

    如若pid是0,getsid返回调用进程的会话首进程的进程组ID。出于安全方面的考虑,某些实现会有如下限制:如若pid并不属于调用者所在的会话,那么调用者就不能得到该会话首进程的进程组ID。

     

    本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

  • 相关阅读:
    高等软工第三次作业——设计也可以按图索骥
    高等软工第二次作业-从需求分析看软件开发的挑战
    高等软工第一次作业——期望与笃信
    【ACM-ICPC 2018 徐州赛区网络预赛】D.Easy Math 杜教筛
    【HDU 6428】Calculate 莫比乌斯反演+线性筛
    【BZOJ 4199】[Noi2015]品酒大会 后缀自动机+DP
    【BZOJ 3238】差异 后缀自动机+树形DP
    【Codeforces Round #466】E. Cashback DP+ST表
    【BZOJ 4709】柠檬 斜率优化dp+单调栈
    Hello Tornado
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3513400.html
Copyright © 2011-2022 走看看