当Wine服务器启动时,它通过open_master_socket()创建一个Unix套接字,稍后启动的所有Wine进程都使用此套接字连接到Wine服务器,这是来自server / request.c的代码,open_master_socket():
771 if (!foreground)
772 {
773 if (pipe( sync_pipe ) == -1) fatal_perror( "pipe" );
774 pid = fork();
775 switch( pid )
776 {
777 case 0: /* child */
778 setsid();
779 close( sync_pipe[0] );
780
781 acquire_lock();
782
783 /* close stdin and stdout */
784 dup2( fd, 0 );
785 dup2( fd, 1 );
786
787 /* signal parent */
788 dummy = 0;
789 write( sync_pipe[1], &dummy, 1 );
790 close( sync_pipe[1] );
791 break;
792
793 case -1:
794 fatal_perror( "fork" );
795 break;
796
797 default: /* parent */
798 close( sync_pipe[1] );
799
800 /* wait for child to signal us and then exit */
801 if (read( sync_pipe[0], &dummy, 1 ) == 1) _exit(0);
802
803 /* child terminated, propagate exit status */
804 wait4( pid, &status, 0, NULL );
805 if (WIFEXITED(status)) _exit( WEXITSTATUS(status) );
806 _exit(1);
807 }
808 }
809 else /* remain in the foreground */
810 {
811 acquire_lock();
812 }
acquire_lock()用于设置主套接字, 问题是在后台运行时,为什么fork()并让子进程完成工作,而父进程只是等待并退出()? 为什么不在前台运行?
答案 0 :(得分:2)
“fork()
让子进程执行” “在后台运行”。
管道是让父母留在周围而儿童确实可能失败的设置(在这种情况下,获取锁定),并在发生故障时正确传播故障的习惯用法;否则,你不能轻易发现孩子失败了,但是必须检查它是否存在或者之后扫描日志文件以查看是否出现了问题。
答案 1 :(得分:1)
是的,守护!
感谢ninjalj,这是实现后台运行守护进程的一般方法,让分叉子进程(守护进程)执行守护进程。
并且使用_exit()而不是exit()的父级是为了避免意外删除临时文件
有关守护进程的更多信息,请参阅
how to make a process daemon和
http://software.clapper.org/daemonize/
geekosaur解释了为什么我们需要在_exit()之前等待孩子。