如何从子进程终止程序?

时间:2016-02-05 20:52:53

标签: c process fork exit terminate

我正在尝试终止我的程序,该程序从文件中获取一个充满命令的行,然后使用execvp处理每个命令

但是,每当遇到quit时,我都希望立即退出处理命令并忽略其后的所有其他命令。

我尝试使用exit()

以下方式执行此操作
for(int i =0;i < numOfCommands;i++)
{
    childPid = fork();
    if(childPid == 0)
    {
        if(execvp(commands[i].cmd[0],commands[i].cmd) == -1)
         {
            /*if(strcmp(commands[i].cmd[0],"quit"))
            {
                done = true;
                return;
            }*/

            if(strcmp(commands[i].cmd[0],"quit")==0)
            {
                printf("Quit command found ! \n Quitting .");
                done = true;
                //return;
                 exit(0);


            }
            printf("Command %s is unknown \n", commands[i].cmd[0]);

        }
    }
    else 
    {
                    //parent process
        wait(&child_status);
    }
  }
}

当然在分叉之后,这发生在子进程内部。但问题是我的程序在退出程序之前一直处理退出后剩下的命令!

2 个答案:

答案 0 :(得分:1)

您可以使用kill(2)向进程组发送信号。您可以在父母或任何子女中执行此操作。

int kill(pid_t pid, int sig);

  

如果pid等于0,则sig被发送到调用进程的进程组中的每个进程。

例如:

kill(0, SIGTERM);

答案 1 :(得分:1)

我认为更好的方法是在父分支之前检查父进程中的quit命令。

但如果您想在孩子身上做这件事,您可以向家长发送信号。

kill(getppid(), SIGUSR1);

父进程需要为SIGUSR1建立一个信号处理程序,清除所有内容并退出。或者您可以发送SIGINT之类的信号,其默认操作是终止进程,但最好实现干净的退出。

此外,在您的代码中,您应该在调用quit之前检查execvp命令。否则,如果用户的路径中有quit个程序,它将永远不会与您的内置quit匹配,因为execvp将成功而不会返回。< / p>