【问题标题】:How to terminate a program from a child process?如何从子进程中终止程序?
【发布时间】:2016-02-06 05:14:32
【问题描述】:

我正在尝试终止我的程序,该程序从文件中获取一行充满命令的行,然后使用 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);
    }
  }
}

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

【问题讨论】:

  • 使用调试器。 _exit() 没有返回,这意味着你做错了。
  • 请显示minimal complete and verifiable example。听起来您可能需要停止处理和/或退出父进程而不是子进程。但是从这个不完整的代码sn-p中无法确定。
  • @kaylum 编辑了我的代码以显示上下文
  • 正如猜测的那样,您正在退出子进程而不是父进程,而启动每个命令的是父进程。如果要停止处理,则父进程应在调用 fork 之前检查命令是否“退出”。
  • @kaylum 非常感谢 Kaylum,我让它工作了,但是你能解释一下为什么当我在孩子身上时它不起作用吗?

标签: c process fork exit terminate


【解决方案1】:

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

int kill(pid_t pid, int sig);

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

例如:

kill(0, SIGTERM);

【讨论】:

    【解决方案2】:

    我认为解决这个问题的更好方法是检查父进程中的quit 命令分叉子进程之前。

    但如果你想在孩子身上做,你可以向父母发送信号。

    kill(getppid(), SIGUSR1);
    

    父进程需要为SIGUSR1 建立一个信号处理程序,清除所有内容并退出。或者你可以发送一个像SIGINT这样的信号,它的默认动作是杀死进程,但最好实现一个干净的退出。

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

    【讨论】:

    • 你能解释一下为什么我需要在父母而不是孩子中处理退出,我一直认为父母只是在等待孩子完成某种事情
    • 如果它要运行一个程序,你只需要 fork 一个孩子。如果命令的目的是控制shell,shell应该直接处理。
    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多