c - 为什么我不能在 Linux 上通过 execvp() 将 killall 与赋予子进程的新名称一起使用?

标签 c linux process

假设我有一个名为“exe”的可执行文件,它生成一个子进程。这个子进程需要成为一个守护进程,我们需要更改它的名字。接下来我想使用 killall 向这个使用新名称的进程发送信号,但我需要使用旧名称。

事件顺序如下:

  1. 开始“执行”
  2. fork -> 如果父节点退出
  3. 分离(chdir、setsid、umask)
  4. execvp('exec', 'daemon', ...)

在 4 上,argv[0] 设置为 'daemon'。

在此之后,我可以执行“ps”和“top”,我清楚地看到名称“daemon”出现在这些命令的输出中。但是,当我尝试使用 killall 终止进程(向其发送信号)时,我必须提供名称“exec”而不是“daemon”。

似乎内核并没有完全意识到这个新名称。

我需要此功能的原因是我想使用相同的可执行文件生成几个具有不同职责的子进程。我还希望能够通过按名称引用它们来单独停止和启动它们。而且我不想将新名称符号链接(symbolic link)到通用 exec 可执行文件(就像 busybox 那样)。

有解决办法吗?

我正在使用 Linux Ubuntu 9.10。

干杯, 约翰

最佳答案

尝试使用 pkill 而不是 killall

关于c - 为什么我不能在 Linux 上通过 execvp() 将 killall 与赋予子进程的新名称一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2386908/

相关文章:

linux - Linux 终端中是否有用于按键的预输入缓冲区?

android - 在Android中,你可以让gmail在单独的任务中运行一个 Intent 吗?

c - 使用未声明的标识符 'ENOMEM'

c - 使用 GDB 调试 va_list args

c - GTK+ 2.0 C 奇怪的结构和 g_signal_connect_swapped

c - 按字母顺序对链接列表进行排序

linux - 禁用回溯

linux - 终端 - 如何运行 HTTP 请求 'PUT'

c# Process.Modules 非常慢

c - 向子进程发送 SIGSTOP 会停止所有执行。 C