【问题标题】:Trouble calling the Unix command kill(int PID) through c program通过 c 程序调用 Unix 命令 kill(int PID) 时遇到问题
【发布时间】:2013-09-21 13:18:57
【问题描述】:

我正在我的一个系统类中用 C 语言编写程序。我们编写 c 代码并在 unix 环境中运行它。我浏览了整个互联网,但似乎找不到任何方法来使 kill(int PID) 命令起作用。该代码将编译并运行良好,但如果我使用

ps -u username

unix 命令提示符中的命令(当然在执行完成之后)它表示我试图在我的 c 代码中杀死的所有进程仍在运行。我可以在 unix 命令提示符下手动输入他们的 PID 来杀死他们,但是对于我来说,我无法弄清楚如何在我的程序中执行它。

在这个特定的程序中,我试图杀死进程 CC,这是一个无限调用 usleep(100) 的进程;直到终止。

我尝试使用 kill(C3, -9);以及 execlp("kill", "kill", C3, (char *)0) 的变体;但仍然没有运气。有谁知道我在这里做错了什么?我唯一的猜测是 kill 命令被传递了错误的 PID 参数,但如果是这种情况,我不知道如何获得正确的参数。

编辑:另外,kill 命令返回零值,我相信这意味着它“成功”执行了命令。

编辑:刚刚注意到我的问题的解决方案一直在作业说明中。对。我很傻。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int args, char* argv[])
{
        //
        //Step 7
        //
        //Create process C3
        int C3=fork();
        if (C3==0)
        {
                execlp("CC", "CC", (char *)0);
        }
        else
        {
        usleep(500000);
        //
        //Step 8
        //
        int ps=fork();
        if (ps==0)
        {
                execlp("ps", "ps", "-u", "cooley", (char *)0);
        }
        else
        {
                wait(NULL);
                kill(C3);
        }
        }
        exit(0);
}

【问题讨论】:

  • 运行 gcc 并在 -Wall -Wextra -pedantic 上出现所有警告会在编译阶段就已经指出了这个问题。

标签: c unix kill pid


【解决方案1】:

您调用kill 系统调用时只有一个参数,而它需要两个参数。这会导致未定义的行为,因为从那时起第二个参数可以是任何东西。您应该在编译时收到关于此的警告。

第二个参数应该是来自&lt;signal.h&gt; 的值(参见signal(7) manual page)。

【讨论】:

  • 感谢您的参考。解决问题的方法是在 PID# 后面加上“, SIGKILL”。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2020-02-28
相关资源
最近更新 更多