【问题标题】:How to detach a forked process from parent in C如何在 C 中将分叉进程与父进程分离
【发布时间】:2012-05-05 21:56:31
【问题描述】:

所以我正在用 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 中执行分叉的进程,尽管在“默认”子句之后。

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

P.S:这只是一个sn-p。

【问题讨论】:

  • 首先你的情况 0: 奇怪的是你有一个 exit(0) 在那里。你在 sn-p 中的逻辑感觉很奇怪
  • 啊。对不起,我粘贴了旧代码。我很抱歉。请忽略exit(0);
  • 你能用正确的代码解决这个问题吗:P?提供可编译的代码实际上很有用。如果代码太大,请使用pastebin.com
  • 完成 :D 感谢您的耐心等待!
  • fork() 两次;在第一个 fork 退出后,第二个进程在 init 下成为 reparented。在 BSD 系统上,您可以使用 daemon() libc 调用;为什么它不是无处不在,这超出了我的理解。

标签: c shell unix exec fork


【解决方案1】:

评论一些明显的错误:

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

编辑: Read the following 解决从子进程分叉的问题。

【讨论】:

  • absPath 包含要执行的文件的完整绝对路径,而 argv[0] 只是文件名。因此,我认为我做不到。我可以吗?
  • 请忽略exit(0),我忘记更新代码了。它是为了我的调试目的而存在的。对不起。
  • 根据linux.die.net/man/3/execv execv 的第一个参数应该是要执行的文件的名称。进程的第一个参数应该是它自己。看看这些例子:cs.ecu.edu/karl/4630/spr01/example1.htmlcs.ecu.edu/karl/4630/spr01/fork.html
  • int execv(const char *path, char *const argv[]);按照惯例,第一个参数应该指向与正在执行的文件关联的文件名。指针数组必须以 NULL 指针终止。令人困惑!
  • 我确实从该网站复制了上述两行:S.
【解决方案2】:

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

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

【讨论】:

猜你喜欢
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多