我正在做家庭作业(常规“用c编写你自己的unix shell”)
并且无法使我的子进程在后台正常运行,在调用execvp
我的直觉告诉我问题在于信号处理程序或return
之后父进程中fork()
的使用。
这就是我实现它的方式(仅适用于后台进程):
void ExeExternal(char *args[MAX], char* cmd,ExecutionMode ExeMode) {
int pID;
switch(pID = fork())
{
case -1:
// Add your code here (error)
/*
your code
*/
perror("fail to fork in : ExeExternal(...)\n");
exit(-1);
case 0 :
// Child Process
signal(SIGTSTP, SIG_DFL);
signal(SIGINT, SIG_DFL);
signal(SIGCONT, SIG_DFL);
usleep(20000);
setpgrp();
printf("trying to execvp\n");
int run_result=execvp(args[0],args);
if(run_result==-1)
{
perror("execvp(...) result in execvp\n");
exit(-1);
}
break; //wont reach this part ever!
default://the parent. pID holds child's pID
setpgid(pID, pID); //note, this is also done in the child
if(ExeMode==BACKGROUND) //no need to WAIT()
{
return;
}
}
}
这是我的信号处理程序(在我的main()中使用signal(SIGCHLD,handle_sigchld)
void handle_sigchld(int sig) {
pid_t pid;
int status;
pid=waitpid(WAIT_ANY,&status,WUNTRACED | WNOHANG);
if (pid >0)
{
if(WIFEXITED(status)) //if terminated normally, return or exit
{
printf("\n[%d] %d Done \n", ID, pid); //[1] a.out : 12340 214 secs
}
else if (WIFSIGNALED(status)) //killed with SIGINT
{
printf("handle_sigchld:[%d] pid %d KILLED\n",ID,pid);
}
else if (WIFSTOPPED(status)) //suspended with SIGCONT
{
printf("\n[%d] %s %d %d secs (stopped)\n", ID, value,pid,time);
}
}
}
我试图种植一些印刷品,我的孩子似乎在执行execvp(...)
之前被杀了
我曾尝试打印args[0]
和args[1]
然后退出,所以它看起来就像访问它们一样,
也 - 这是使用return
的正确方法吗?香港专业教育学院试图用waitpid(pid,status,WNOHANG)
替换它,但它没有帮助
非常感谢任何帮助!甚至只是提示正确的方向