所以我在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:这只是一个片段。
答案 0 :(得分:2)
评论一些明显的错误:
exit(0);
,从而立即退出子进程。删除此行。execv()
execv(argv[0], argv);
修改强> Read the following解决从子进程分叉的问题。
答案 1 :(得分:1)
作为我的Fat Controller应用程序的一部分,我创建了一个可以使进程守护进程的库。下载源代码并查看daemonise.c - 它应该得到相对较好的评论,但如果您有任何进一步的问题,那么我很乐意提供帮助。