如何在C中从父项分离分叉进程

时间:2012-04-25 08:17:37

标签: c shell unix exec fork

所以我在C中设计一个基本的UNIX shell。

    signal(SIGCHLD, handler);
        pid = fork();
        switch (pid) {
        case -1: printf("Fork failed; cpid == -1\n");
        break;

        case 0: child_pid = getpid();
                argv[0] = prog;
        argv[1] =NULL;
        //exit(0);
        sid = setsid();
        execv(absPath,argv);        
        //printf("%d: this is the child, pid = %d\n", i, child_pid);
        //sleep(1);
        //exit(0);
        break;

        default: printf("This is the parent: waiting for %d to finish\n", pid);
        waitpid(pid, NULL, WNOHANG);
        printf("Ttttthat's all, folks\n");
        //break;
        }
        //execv(absPath,argv);
        //printf("CHILD PROCESS");
    }

}
void handler(int sig)
{
  pid_t pid;

  pid = wait(NULL);

  printf("Pid %d exit.\n", pid);
  exit(0);
}

但它仍然在同一个shell中执行forked进程,但是在“default”子句之后。

你能帮助我让它作为后台进程运行吗?谢谢!

P.S:这只是一个片段。

2 个答案:

答案 0 :(得分:2)

评论一些明显的错误:

  • 在子进程中执行exit(0);,从而立即退出子进程。删除此行。
  • 我认为为了清楚起见,您应该像execv()
  • 一样致电execv(argv[0], argv);

修改 Read the following解决从子进程分叉的问题。

答案 1 :(得分:1)

作为我的Fat Controller应用程序的一部分,我创建了一个可以使进程守护进程的库。下载源代码并查看daemonise.c - 它应该得到相对较好的评论,但如果您有任何进一步的问题,那么我很乐意提供帮助。

http://sourceforge.net/projects/fat-controller/files/