【发布时间】: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 调用;为什么它不是无处不在,这超出了我的理解。