Linuxプラットフォーム下setsid()関数

8076 ワード

setsid()関数の説明

[root@iZn6p6j5eiblyzZ cyh]# man setsid

NAME
       setsid - run a program in a new session

SYNOPSIS
       setsid program [arg...]

DESCRIPTION
       setsid runs a program in a new session.

説明:プロセスがセッションのプロセスグループ長プロセスである場合setsid()呼び出しに失敗し、(-1)を返します.setsid()呼び出しが成功すると、新しいセッションのIDが返され、setsid関数を呼び出すプロセスが新しいセッションの先頭プロセスとなり、親プロセスのセッショングループとプロセスグループから離れます.セッションの制御端末に対する独占性のため、プロセスは同時に制御端末から離脱する.
  • プロセスグループの説明:各プロセスは、1つのプロセスIDに加えて、1つのプロセスグループに属し、プロセスグループは通常、1つ以上のプロセスの集合である.これらのプロセスは通常、ジョブに関連しています.
  • [root@iZn6p6j5eiblyzZ cyh]# ps -o pid,pgid,sid,command|cat
      PID  PGID   SID COMMAND
     5681  5681  5617 su
     5682  5682  5617 bash
     5778  5778  5617 ps -o pid,pgid,sid,command
     5779  5778  5617 cat
    [root@iZn6p6j5eiblyzZ cyh]# 

    PGIDはプロセスグループを識別し、PIDとPGIDが等しいため、psプロセスはプロセスグループリーダープロセスであり、catプロセスはこのプロセスグループの下のプロセスに属する.

    親プロセス・グループとセッション・グループからの離脱を実現


    -

    失敗例

    #include
    #include
    #include
    #include
    
    int main(int argc, char *argv[])
    {
        pid_t pid;
    
        fprintf(stdout, "PID:%d, PGID:%d, SID:%d
    "
    , getpid(), getpgrp(), getsid(0)); if(setsid() < 0) { fprintf(stderr, "setsid error:%s
    "
    , strerror(errno)); } while(1); return 0; } [cyh@iZn6p6j5eiblyzZ ~]$
    [cyh@iZn6p6j5eiblyzZ ~]$ ./llinux
    PID:5980, PGID:5980, SID:5935
    setsid error:Operation not permitted

    前の例では、現在のプロセスがグループ長プロセスであり、この関数がグループ長プロセス呼び出しを許可しないため、プロセスグループの作成に失敗しました.
    プロセスがセッションのプロセスグループ長プロセスである場合setsid()呼び出しに失敗し、(-1)を返します.

    正しい例

    #include 
    #include 
    int main()
    {
        if(fork > 0)
        {
            while(1);
        }
        else
        {
            setsid();
            while(1)
        }
    }
    [cyh@iZn6p6j5eiblyzZ ~]$ ps -fu cyh
    UID        PID  PPID  C STIME TTY          TIME CMD
    cyh       3855   469  0 9 21 tty1     00:00:00 -bash
    cyh       5934  5932  0 22:13 ?        00:00:00 sshd: cyh@pts/0
    cyh       5935  5934  0 22:13 pts/0    00:00:00 -bash
    cyh       5960  5935  0 22:14 pts/0    00:00:00 ps -fu cyh
    [cyh@iZn6p6j5eiblyzZ ~]$ ./t_setsid &
    [1] 5961
    [cyh@iZn6p6j5eiblyzZ ~]$ ./t_setsid &
    [2] 5962
    [cyh@iZn6p6j5eiblyzZ ~]$ ps -o pid,pgid,sid,command
      PID  PGID   SID COMMAND
     5935  5935  5935 -bash
     5961  5961  5935 ./t_setsid
     5962  5962  5935 ./t_setsid
     5964  5964  5935 ps -o pid,pgid,sid,command
    [cyh@iZn6p6j5eiblyzZ ~]$ 

    上記の例ではsetsid()関数を使用して、新しいセッションと新しいプロセスグループの作成に成功しました.新しいプロセスチーム長、PGID:5961および5962.