【问题标题】:Kill while redirecting output in C doesn't really kill在 C 中重定向输出时杀死并不会真正杀死
【发布时间】:2018-05-09 18:49:24
【问题描述】:

我有一个父进程,其中有一个 while 循环。在那个while循环中,我创建了孩子(计数次数)。如果任何孩子发生错误,我不希望将任何其他内容写入标准输出,只需要第一条错误消息。

当发生错误时,我希望程序关闭所有子项和父项,我该怎么做。我正在尝试:

while(count--) {
    pid = fork();
    if(pid > 0){
      wait(NULL); 
      if(execlp(command1,command2,(char *)NULL) < 0){ // error occured
        char str[1024] = "errr";
        perror(str); 
        sprintf(str, "kill -SIGINT %d >> /dev/null 2>&1",getppid());  
        system(str); 
      }
  }

但它不起作用,它会多次打印错误

我想在发生单个错误时终止/终止程序,以便不打印其他消息

count 是 5,command1 和 command 2 是 "ls"

【问题讨论】:

  • 您的父进程坐在那里等待其子进程死亡,但子进程返回循环并再次分叉,第一个子进程现在等待其自己的子进程死亡,然后再与 @987654323 混淆@ 如果成功,它将替换父进程。由于您看到错误消息,execlp() 一定是失败的。由于许多进程中的每一个都失败了,因此您会收到很多消息。很难知道你想做什么,但显然不是你实际在做什么。
  • 顺便说一句,如果您显示您的代码,它会更容易为您提供帮助。请阅读如何创建 MCVE (minimal reproducible example)。
  • 我试图在发生单个错误时终止/终止程序,以便不打印其他消息
  • 顺便提一下,str 应该在传递给 perror 之前进行初始化,或者 perror 可以传递 0 或 ""
  • 也许你应该调用kill(),在将初始进程设置为进程组负责人之后,向进程组中的所有进程发送 SIGTERM。但如果不知道你被教导了什么,很难猜出什么是合适的。您的代码不会检测到所有错误,进程也不会在报告错误时退出。使用系统运行kill 命令是非常重量级的处理。改为调用 kill 函数

标签: c operating-system fork system-calls kill


【解决方案1】:

答案是为进程提供一种与父进程通信的方式,并且在任何子进程出现故障时让父进程打印错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2016-08-30
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多