网站专题页是什么,网站后台是什么,响应式网页设计优缺点,东莞公司企业设计网站建设1. 进程组
#xff08;1#xff09;概念#xff1a;一个或多个进程的集合#xff0c;也称为“作业”。
#xff08;2#xff09;父进程创建子进程时#xff0c;默认属于同一个进程组。进程组ID为组长进程ID。
#xff08;3#xff09;进程组中只要有一个进程存在1概念一个或多个进程的集合也称为“作业”。
2父进程创建子进程时默认属于同一个进程组。进程组ID为组长进程ID。
3进程组中只要有一个进程存在进程组就存在与组长进程是否终止无关。
4父子进程可不属于同一进程组。
进程组相关函数
1getpgrp函数
#includeunistd.hpid_t getpgrp(void);
/*
功能获取当前进程的进程组ID
返回值总是成功。
*/
2getpgid函数
#includeunistd.hpid_t getpgid(pid_t pid);
/*
功能获取指定进程的进程组ID
参数pid进程号若为0则功能和getpgrp一样
返回值成功进程组ID失败-1
*/
3setpgid函数
#includeunistd.hint setpgid(pid_t pid, pid_t pgid);
/*
功能将进程pid的进程组改为pgid可创建新的进程组
返回值成功0失败-1
*/ 2. 会话
概念一个或多个进程组的集合。
创建会话注意事项
1组长进程不能创建会话否则返回出错
2创建会话的非组长进程变成新会话的首进程session header也称为会长进程同时会创建一个新进程组并成为组长进程因为新会话中至少要有一个进程组
3组长进程不会成为新会话首进程新会话首进程会成为组长进程
4需要root权限Ubuntu等除外
5新会话丢弃原有控制终端该会话无控制终端
6创建新会话时先调用fork父进程终止子进程调用setsid创建会话函数
会话相关函数
1getsid函数
#includeunistd.hpid_t getsid(pid_t pid);
/*
功能获取进程所属的会话
参数pid进程号若为0则表示查看当前进程的会话ID
返回值成功会话ID失败-1
*/
getsid示例
#includestdio.h
#includestdlib.h
#includestring.h
#includeunistd.hint main(int argc, const char* argv[]) {pid_t pid -1;// 获取当前进程组会话IDpid getsid(0);if (-1 pid) {perror(getsid);return 1;}printf(当前进程的会话ID%d\n, pid);return 0;
}
运行结果 2setsid函数
#includeunistd.hpid_t setsid(void);
/*
功能创建新会话并用自己的ID设置为新进程组ID和新会话ID该进程将成为新进程组组成和新会话会长。
返回值成功新会话ID失败-1.
*/
setsid示例
#includestdio.h
#includestdlib.h
#includestring.h
#includeunistd.hint main(int argc, const char* argv[]) {pid_t pid -1;printf(父进程pid%d\n, getpid());printf(父进程所属进程组的组长进程pid%d\n, getpgrp());printf(父进程所属会话的会长进程pid%d\n, getsid(0));// 创建新会话printf(父进程%d即将创建新会话...\n, getpid());pid setsid(); // 失败if (-1 pid) {printf(创建失败父进程为组长进程组长进程不可创建新会话..\n);perror(setsid);}pid fork();if (-1 pid) {perror(fork);return 1;}if (0 pid) { // 子进程printf(\n子进程创建成功其pid%d其组长进程%d\n, getpid(), getpgrp());printf(子进程%d即将创建新会话...\n, getpid());pid setsid(); // 创建会话if (-1 pid) {perror(setsid);return 1;}printf(子进程创建新会话成功\n);printf(子进程所属进程组的组长进程pid%d\n, getpgrp());printf(子进程所属会话的会长进程pid%d\n, getsid(0));printf(子进程的父进程pid%d\n, getppid());} else {sleep(2);printf(\n子进程创建会话后父进程情况\n);printf(父进程所属进程组的组长进程pid%d\n, getpgrp());printf(父进程所属会话的会长进程pid%d\n, getsid(0));while (1) {sleep(1);}}return 0;
}
运行结果 结果可知
1组长进程不可创建新会话
2非组长进程这个示例中的子进程创建新会话后会成为新会话的会长同时也会创建一个新进程组并成为组长因为新会话中至少要有一个进程组
3子进程创建新会话成为新会长和新组长后并不会影响父进程的组长和会长
4父子进程可不属于同一个进程组也可不属于同一会话。