zoukankan      html  css  js  c++  java
  • setsid

    1. 介绍

    #include <unistd.h>
    pid_t setsid(void);
    

    创建新的会话,并设进程组ID为新的会话ID

    2. linux中各种进程组控制

    单个进程使用进程pid控制;

    如果想同时控制多个进程,需要进程组,进程组中的进程都是由一个进程fork()出来的;

    进程组可以分前台进程组和后台进程组:

    • 前台进程组: 可以直接接收终端控制信号的进程组,正在前台运行的,比如按 ctrl+c,可以直接给正在运行的进程组发中断信号
    • 后台进程组:不能直接接收终端控制,比如按 ctrl+c,不能传递给后台进程

    谁负责判断哪个是前台进程组,哪个是后台进程组?进而给前台进程组一个控制终端呢?是会话组来管理的;

    一个会话组包含1个前台进程组和多个后台进程组,一个会话组有1个会话id。只有会话组的领头进程能获取控制终端,进而控制哪个进程组可以受控制终端控制;

    一般打开一个shell,就新建一个会话组,有一个控制终端;关闭这个shell,会给当前会话组中的所有进程(包括前台和后台)发送一些中断信号,告诉进程这个会话组要退出了,你们看着办。

    设置daemon程序时,主要目的是为了让程序不受当前控制终端信号影响。因此先fork()一次,调用setsid() 开个新的会话组,这样就不受启动这个程序的shell的信号影响了。有的会再fork()一次,是因为只有会话的领导进程能获取控制终端,再fork()出来的进程是领导的子进程,一定不会获取控制终端。其实不fork()第二次也可以,nginx都没这样。

    至于具体有哪些输入输出和tty那些,之后再看吧。

  • 相关阅读:
    angular二级联动菜单
    angular 实现自定义样式下拉菜单
    编程思想之回调
    编程思想之递归
    编程思想之迭代器
    阅读源码FluentScheduler
    改变spring-servlet.xml名字和默认位置
    thinkpad X1c 2018 插上电源风扇转速过快的解决办法
    python 和python-m 的区别
    电脑
  • 原文地址:https://www.cnblogs.com/suntus/p/15225895.html
Copyright © 2011-2022 走看看