【问题标题】:Remove terminal mesage after kill system call杀死系统调用后删除终端消息
【发布时间】:2018-05-09 16:59:30
【问题描述】:

我正在使用以下方法杀死父母的孩子:

kill(pid, SIGTERM);

输出到终端

Terminated

Terminated 怎么不显示?

pid_t pid ;
pid = fork();
if(pid == 0){ // pid is process index id in parent process
  wait(NULL); // wait for state changes in child 
  if(execlp(argv[1],argv[1],NULL) == -1){ // argv1 can be either valid or invalid (for example ls or alsjdf)
      char str[128];
      sprintf(str, "./multifork: %s",argv[1]);
      perror(str); 
      kill(pid, SIGINT);
  }
}

如果 argv[1] 不是一个合法的系统调用,我想退出所有程序——包括父程序和子程序,它们都是在那之后创建的。

【问题讨论】:

  • 可以尝试 SIGINT。我不记得当你用 CTRL+C 杀死时看到消息...
  • 是的。发送 SIGINT(2) 会默默地杀死。发送 SIGKILL(9) 会导致打印“Killed”。您可以使用 kill -2 测试您的情况
  • 但是当我使用 SIGINT 时它添加了一个新行。可以从输出中删除\n
  • 我的意思是Terminated / 什么都会parent 进程被信号杀死时发生。如果您的子进程被信号杀死并且父进程等待它,shell 将不会打印任何内容。
  • 你可以试试这个而不是 kill 指令: sprintf(str, "kill -SIGINT %d >> /dev/null 2>&1",pid);系统(str);

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


【解决方案1】:

你可以试试这个而不是杀死指令:

sprintf(str, "kill -SIGINT %d >> /dev/null 2>&1",pid); 
system(str);

system 用于在 shell 中执行命令。 ">> /dev/null 2>&1" 将打印重定向到 /dev/null,换句话说,放弃打印答案(“终止”)。

【讨论】:

  • 您能否解释一下它的作用,以便将来也能有所帮助。
  • 我理解的方式是:kill -SIGINT pid == kill(getpid(),SIGINT); //杀死父母; dev/null 将标准输出重定向到 /dev/null,它会丢弃它;2>&1 -> 将 STDERR 重定向到 STDOUT
  • 有很多文章描述了打印重定向机制。一个例子:unix.stackexchange.com/questions/163352/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
相关资源
最近更新 更多