曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5260|回复: 0
打印 上一主题 下一主题

[进程] getsid() -- 获得会话ID

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-12-31 17:24:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
getsid() 的原型如下:
#include <unistd.h>
pid_t getsid(pid_t pid);
该函数返回会话首进程的进程组ID (session ID)。
会话 (session) 是一个或多个进程组的集合。

进程组的实例可以如下所示:
cat /etc/passwd |grep "beyes" |wc -c
上面的 3 个命令执行起来就是 3 个进程,它们由管道线相连,这几个进程就是一个进程组。进程组又分为前台进程组和后台进程组,后台进程组就是常见的使用了 & 符号让命令在后台运行。

比如,在我们通过一个终端登录到 Linux 服务器时,会创建一个新的会话,创建这个新会话的进程我们成为领头进程(session leader),它的进程 ID (PID) 就是该会话的 ID ,这里像你所使用的 bash shell 就是一个领头进程,它的 PID 值就作为它所创建的会话的 ID 。以后,在这个 shell 里所运行的命令(进程,以及子进程)都将继承其父进程的会话 ID 。

测试代码:
[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>


int main()
{
    pid_t mypid = getpid();


    printf ("%d\n", getsid(mypid));


    return 0;
}

运行输出:
./getsid
4796
我们再运行下面两个命令:
$ echo $$
4796
$ps aux |grep 4796
beyes     4796  0.0  0.1   5276  2532 pts/2    Ss   08:48   0:00 -bash
上面的 $$ 表示当前所在 shell 的 PID 值。

也可以获得别的进程的会话 ID ,如下程序可以从命令行参数中指定别的进程的 PID 而获得该进程所在的会话的会话 ID:
[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
        int i = atoi(argv[1]);
        printf ("%d\n", getsid(i));

        return 0;
}

开启另外一个终端窗口,然后运行下面的程序 tmp :
[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>

int i = 0;

int main()
{
        while (1) {
                if (i == 100) {
                   return 0;
                }
                printf ("hello world\n");
                sleep (5);
                i++;
        }
}

可以在另外一个窗口里查看该程序的 PID :
$ ps aux |grep tmp
root        10  0.0  0.0      0     0 ?        S    17:39   0:00 [kdevtmpfs]
beyes     1254  0.0  1.6  50312 34040 ?        SNl  17:40   0:01 /usr/bin/virtuoso-t +foreground +configfile /tmp/virtuoso_hX1248.ini +wait
beyes     2155  0.0  0.0   2012   272 pts/2    S+   18:08   0:00 ./tmp
beyes     2242  0.0  0.0   6448   800 pts/3    S+   18:08   0:00 grep --color=auto tmp

接着运行上面的 getsid 程序,并指定 tmp 程序的 PID ,可以看到:
$ ./getsid 2155
1974

现在中断 tmp 的运行,在其所在的终端窗口里可以观察到:
$ echo $$
1974
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 02:19 , Processed in 0.078956 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表