进程组和会话

进程组是若干个进程的集合,每个进程组都有一个组长,不管组长终止与否,只要有进程运行

进程组就存在,组长的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;
}

猜你喜欢

转载自blog.csdn.net/BJUT_bluecat/article/details/83787740