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;
}
运行输出:
我们再运行下面两个命令:$ 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 ,可以看到:
现在中断 tmp 的运行,在其所在的终端窗口里可以观察到: |