setsid函数说明

来源:互联网 发布:昆山美工培训多少钱 编辑:程序博客网 时间:2024/04/30 12:25
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<signal.h>


int main( void )
{
    daemon_init();

    fprintf(stderr, "main进程[%d]\n", getpid() );
    while( 1 )
    {
    }

    exit(0);
}


int daemon_init()
{
    pid_t pid;

    if( getppid() == 1 )
    {

        umask( 0 );

        return 0;
    }


    if( (pid = fork()) < 0 )
    {
        fprintf(stderr, "fork err!\n");
        return -1;
    }
    else if( pid > 0 )
    {
        fprintf( stderr, "结束进程[%d]\n", getpid() );
        exit( 0 );

    }

    fprintf( stderr, "孤儿进程[%d]\n", getpid() );
    signal( SIGHUP, SIG_IGN );
    signal( SIGQUIT, SIG_IGN );
    signal( SIGCHLD, SIG_IGN );

    setsid();
    umask( 0 );

    return 0;

}

运行结果:

188DCCLINK-/home/ap/dcclink/.shan/practice>./ff
孤儿进程[14307]
main进程[14307]
结束进程[14306]

当进程是会话的领头进程时setsid()调用失败并返回(-1)。setsid()调用成功后,返回新的会话的ID,调用setsid函数的进程成为新的会话的领头进程,并与其父进程的会话组和进程组脱离。由于会话对控制终端的独占性,进程同时与控制终端脱离。


  调用setsid有3个作用:
1 让进程摆脱原会话的控制;
2 让进程摆脱原进程组的控制;
3 让进程摆脱原控制终端的控制;
总之,就是让调用进程完全独立出来,脱离所有其他进程的控制。

0 0
原创粉丝点击