为什么我的孩子后台进程(fork-execvp)会不稳定地死掉,但是在前台工作得很好?

时间:2014-11-15 18:02:07

标签: c linux fork background-process

我正在做家庭作业(常规“用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)替换它,但它没有帮助

非常感谢任何帮助!甚至只是提示正确的方向

0 个答案:

没有答案