会话

一、会话的概念

会话:是一个或多个进程组的集合。

 

二、创建会话

创建一个会话需要注意以下6点注意事项:

  • 调用进程不能是进程组组长,该进程变成新会话首进程(session header)
  • 该进程成为一个新进程组的组长进程。
  • 需要root权限(ubuntu不需要)
  • 新会话丢弃原有的终端控制,该会话没有控制终端
  • 该调用进程是组长进程,则出错返回
  • 建立会话时, 先调用fork,父进程终止,子进程调用setsid

 

三、主要函数应用

1. getsid函数原型:

    函数作用:获取进程所属会话ID

#include <unistd.h>
pid_t getsid(pid_t pid);
                       返回值:若成功,返回会话首进程的进程组ID;若出错,返回-1

分析:

  • pid为0,返回调用进程的会话首进程的进程组ID
  • 如果pid不属于调用者所在的会话,那么调用进程就不能

ps ajx命令查看系统中的进程,参数a表示不仅列出当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j列出与作业控制相关的信息。

注意:组长进程不能成为新会话首进程,新会话首进程必定会成为组长进程。

 

2. setsid函数原型:

    函数作用:创建一个会话,并以自己的ID设置进程组ID,同时也是新会话ID

#include <unistd.h>
pid_t Setsid(void);
                       返回值:若成功,返回进程组ID;若出错,返回-1

分析:调用了setsid函数的进程,既是新的会长,也是新的组长。

 

四、程序清单

测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main()
{
    pid_t pid;
    if((pid = fork()) < 0) 
    {
        perror("fork");
        exit(1);
    } 
    else if(pid == 0) 
    {
        
        printf("child process PID is %d\n", getpid()); 
        printf("Group process of child is %d\n", getpgid(0));
        printf("Session ID of child is %d\n", getsid(0));
          
        sleep(10);
        setsid();  //子进程非组长进程,故其成为新会话首进程,且成为组长进程,该进程组id即为会话进程id 
        
        printf("--------change----------\n");
        
        printf("child process PID is %d\n", getpid()); 
        printf("Group process of child is %d\n", getpgid(0));
        printf("Session ID of child is %d\n", getsid(0));
        
        sleep(20); 
        exit(0);       
    }
    printf("parent process PID is %d\n", getpid()); 
    return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main()
{
    pid_t pid;
    if((pid = fork()) < 0) {
        perror("fork");
        exit(1);
    } else if(pid == 0) {
        
        printf("child process PID is %d\n", getpid()); 
        printf("Group process of child is %d\n", getpgid(0));
        printf("Session ID of child is %d\n", getsid(0));
          
        sleep(10);
        setsid();  //子进程非组长进程,故其成为新会话首进程,且成为组长进程,该进程组id即为会话进程id 
        
        printf("change\n");
        
        printf("child process PID is %d\n", getpid()); 
        printf("Group process of child is %d\n", getpgid(0));
        printf("Session ID of child is %d\n", getsid(0));
        
        sleep(20); 
        exit(0);       
    }
    printf("parent process PID is %d\n", getpid()); 
    return 0;
}

输出结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值