zoukankan      html  css  js  c++  java
  • 会话

    会话

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

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

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

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

    pid_t Setsid(void);

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


    2. getsid函数:获取进程所属会话ID

    pid_t getsid(pid_t pid);

    分析:

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

    3. 举例说明

    sunbin@sunbin:~$ cat | cat &
    [1] 53903
    sunbin@sunbin:~$ cat | cat | cat

    结果分析:

     ppid    pid   pgid   sid
     41184  53884  41270  41270 ?            -1 Rl    1000   0:00 /usr/lib/gnome-ter
     53884  53889  53889  53889 pts/4     53904 Ss    1000   0:00 bash
     53889  53902  53902  53889 pts/4     53904 T     1000   0:00 cat
     53889  53903  53902  53889 pts/4     53904 T     1000   0:00 cat
     53889  53904  53904  53889 pts/4     53904 S+    1000   0:00 cat
     53889  53905  53904  53889 pts/4     53904 S+    1000   0:00 cat
     53889  53906  53904  53889 pts/4     53904 S+    1000   0:00 cat
     53884  53907  53907  53907 pts/18    53918 Ss    1000   0:00 bash
     53907  53918  53918  53907 pts/18    53918 R+    1000   0:00 ps ajx

    程序清单

    1. 测试代码:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <unistd.h>
     4  
     5 int main()
     6 {
     7     pid_t pid;
     8     if((pid = fork()) < 0) 
     9     {
    10         perror("fork");
    11         exit(1);
    12     }
    13     else if(pid == 0) 
    14     {
    15         printf("child process PID is %d
    ", getpid()); 
    16         printf("Group process of child is %d
    ", getpgid(0));
    17         printf("Session ID of child is %d
    ", getsid(0));
    18           
    19         sleep(10);
    20         setsid();  //子进程非组长进程,故其成为新会话首进程,且成为组长进程,该进程组id即为会话进程id 
    21         
    22         printf("change
    ");
    23         
    24         printf("child process PID is %d
    ", getpid()); 
    25         printf("Group process of child is %d
    ", getpgid(0));
    26         printf("Session ID of child is %d
    ", getsid(0));
    27         
    28         sleep(20); 
    29         exit(0);       
    30     }
    31     printf("parent process PID is %d
    ", getpid()); 
    32     return 0;
    33 }

    输出结果:

  • 相关阅读:
    查找数据库表中重复的 Image 类型值
    C#中的引用传递和值传递。
    用JS解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题
    根据业务自己设计的.NET工厂模式架构
    封装EF code first用存储过程的分页方法
    2013款MacBook Air装Windows7单系统
    js判断是否在微信浏览器中打开
    EF Code First连接现有数据库
    JS中for循序中延迟加载实现动态效果
    DIV+CSS左右两列自适应高度的方法
  • 原文地址:https://www.cnblogs.com/sunbines/p/10263569.html
Copyright © 2011-2022 走看看