进程组是若干个进程的集合,每个进程组都有一个组长,不管组长终止与否,只要有进程运行
进程组就存在,组长的pid就是getpgrp()。
会话是进程组的集合,包含多个进程组,但是只有一个前台进程组。
进程调用setsid可以建立新对话期,成功调用返回进程组id,出错返回-1,调用函数的进程如果不是组长,
则此函数创建一个新的会话期。
1.此进程称为新的会话的首进程,也是目前唯一一个进程。
2.成为新进程组的组长进程
3.此进程没有控制终端(每个会话都有一个控制终端),如果之前有,也要接触联系。
会话和进程组特性:
1.一个会话又一个控制终端,通常是我们登录的终端设备。
2.与控制终端连接的会话首进程,被称为控制进程。
3.一个会话可以分为一个前台进程组,或一个或多个后台进程组。
4.delete 或者crtl+c会造成将中断信号或者退出信号送到前台进程组的所有进程。
//
// main.cpp
// pid_7
//
// Created by 蓝猫 on 2018/11/3.
// Copyright © 2018年 蓝猫. All rights reserved.
//
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
using namespace std;
/*
进程组是若干个进程的集合,每个进程组都有一个组长,不管组长终止与否,只要有进程运行
进程组就存在,组长的pid就是getpgrp()。
*/
void fun1()
{
pid_t pid;
pid=fork();
if(pid<0)
{
perror("fork error \n");
exit(1);
}
else if(pid==0)
{
cout<<"子进程:"<<getpid()<<" 进程组号:"<<getpgrp()<<endl;
pid_t group=getpgrp();
pid_t pid2=fork();
if(pid2==0)
{
if(setpgid(getpid(), group)==0)
{
cout<<"孙子进程:"<<getpid()<<" 成功加入进程组,进程组号:"<<getpgrp()<<endl;
}
}
exit(0);
}
else
{
//wait(NULL);
cout<<"父进程:"<<getpid()<<" 进程组号:"<<getpgrp()<<endl;
exit(0);
}
}
/*
会话是进程组的集合,包含多个进程组,但是只有一个前台进程组。
进程调用setsid可以建立新对话期,成功调用返回进程组id,出错返回-1,调用函数的进程如果不是组长,
则此函数创建一个新的会话期。
1.此进程称为新的会话的首进程,也是目前唯一一个进程。
2.成为新进程组的组长进程
3.此进程没有控制终端(每个会话都有一个控制终端),如果之前有,也要接触联系。
会话和进程组特性:
1.一个会话又一个控制终端,通常是我们登录的终端设备。
2.与控制终端连接的会话首进程,被称为控制进程。
3.一个会话可以分为一个前台进程组,或一个或多个后台进程组。
4.delete 或者crtl+c会造成将中断信号或者退出信号送到前台进程组的所有进程。
*/
void fun2()
{
pid_t pid;
pid=fork();
if(pid==0)
{
pid_t pid2;
pid2=setsid();
cout<<"建立新的会话,进程组ID:"<<pid2<<" 当前进程:"<<getpid()<<endl;
}
}
int main(int argc, const char * argv[])
{
fun1();
return 0;
}