設計在背景執行的 Linux 程式

下面這段 vsftpd 的 source code ,就是使 vsftpd 啟動後,在背景執行的方法:

54
55   /*
56    * tracing date : 2006-10-17
57    */
58   if (tunable_background)
59   {
60       /*
61        * fork()
62        */
63     int forkret = vsf_sysutil_fork();
64     if (forkret > 0)
65     {
66       /* Parent, just exit */
67       vsf_sysutil_exit(0);
68     }
69
70     /*
71      * 2006-10-17 - so.. setsid()
72      */
73     vsf_sysutil_make_session_leader();
74   }
75

方法是,透過 fork() child process,以 setsid() 讓 child process 成為 process leader,有自己的 process group,

parent process 單純結束,下面是 vsf_sysutil_make_session_leader() 

vsftpd-2.0.3/sysutil.c
2463
2464 void
2465 vsf_sysutil_make_session_leader(void)
2466 {
2467   /* This makes us the leader if we are not already */
2468   (void) setsid();
2469   /* Check we're the leader */
2470   if (getpid() != getpgrp())
2471   {
2472     die("not session leader");
2473   }
2474 }
2475

參考文獻
Douglas E. Comer, David L. Stevens, Internetworking with TCP/IP, Vol. III: Client-Server Programming and Applications, Linux/Posix Sockets Version, Vol. 3, Chap. 30, 2000.
Comments