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関数を呼び出すプロセスが新しいセッションの先頭プロセスとなり、親プロセスのセッショングループとプロセスグループから離れます.セッションの制御端末に対する独占性のため、プロセスは同時に制御端末から離脱する.
[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.