会话
会话是一个或多个进程组的集合,通常是由shell的管道线将几个进程编成一组;会话首进程是新建会话时,会话中的唯一进程,其进程ID等于会话ID;
下面是新建会话和获取会话首进程的进程组ID的函数:
- /* 会话 */
- /*
- * 函数功能:建立一个新会话;
- * 返回值:若成功则返回进程组ID,若出错则返回-1;
- * 函数原型:
- */
- #include <unistd.h>
- pid_t setsid(void);
- /*
- * 函数功能:获取会话首进程的进程组ID;
- * 返回值:若成功则返回会话首进程的进程组ID,若出错则返回-1;
- * 函数原型:
- */
- pid_t getsid(pid_t pid);
- /*
- * 若pid = 0,则返回调用进程的会话首进程的进程组ID;
- */
若调用 setsid 函数的进程不是一个进程组组长,则此函数就会创建一个新会话,结果将发生下面三件事:
- 该进程变成新会话首进程(session leader)。(会话首进程是创建该会话的进程)此时,该进程是新会话中的唯一进程。
- 该进程称为一个新进程组的组长进程,新进程组ID是该调用进程的进程ID。
- 该进程没有控制终端,如果在调用setsid之前该进程有一个控制终端,那么这种联系也会被中断。
测试程序:
- #include "apue.h"
- #include <sys/types.h>
- int main(void)
- {
- pid_t pid;
- if((pid = fork()) < 0)
- err_sys("fork error");
- else if(0 == pid)
- {
- setsid();
- printf("child process pid is %d\n",getpid());
- printf("group id is %d\n",getpgid(0));
- printf("My father id is %d\n",getppid());
- printf("My session id is %d\n",getsid(0));
- }
- else
- {
- printf("parent process pid is %d\n",getpid());
- printf("group id is %d\n",getpgid(0));
- printf("My father id is %d\n",getppid());
- printf("My session id is %d\n",getsid(0));
- }
- }
- parent process pid is 4854
- group id is 4854
- My father id is 2982
- My session id is 2982
- child process pid is 4855
- group id is 4855
- My father id is 1
- My session id is 4855