【问题标题】:killall(1) equivalent system call or C library callkillall(1) 等效系统调用或 C 库调用
【发布时间】:2015-04-24 13:16:29
【问题描述】:

在启动新实例之前,我必须停止早期的进程实例。为此,我需要系统调用或 C 库调用。

目前我使用 "system("killall name")。这可行,但我想用任何等效的 system(2)/library(3) 调用替换它。有什么选择?

还可以从目录中删除文件,如 "system("rm -f /opt/files*")", 什么是备用库(3)/系统(2)调用? 请注意文件名中的 *,一键删除所有文件。

问候, AK

【问题讨论】:

  • 感谢您的回复。第二部分 - system(" rm -f /tmp/files* ") 怎么样?

标签: linux system libc kill-process


【解决方案1】:

据我所知,没有通用的方法可以做到这一点,因为没有通用的方法可以通过进程名称获取 pid

你要收集相关进程的pids,调用int kill(pid_t pid, int signo);函数

至少你可以试试看killall自己是如何实现的


Ben 的链接中的一个小补充,killall 调用了以下几行,即通过find_pid_by_name 函数收集相关进程的pids,其实现可以找到here

pidList = find_pid_by_name(arg);
if (*pidList == 0) {
    errors++;
    if (!quiet)
        bb_error_msg("%s: no process killed", arg);
} else {
    pid_t *pl;

    for (pl = pidList; *pl; pl++) {
        if (*pl == pid)
            continue;
        if (kill(*pl, signo) == 0)
            continue;
        errors++;
        if (!quiet)
            bb_perror_msg("can't kill pid %d", (int)*pl);
    }
}

【讨论】:

  • 在 Linux 上用 C 语言编写进程列表非常简单:readdir/proc/ 文件系统。关注名称以数字开头的子目录。 readlink/proc/1234/exe 符号链接(其中 1234 是数字开头名称的示例)。
  • 没错,Erik Andersen 采用了同样的方法。 git.busybox.net/busybox/tree/libbb/find_pid_by_name.c
【解决方案2】:

你可以在这里看到busybox中的实现:http://git.busybox.net/busybox/tree/procps/kill.c

您还可以将busybox 链接为共享库并调用其kill_main,而不是启动单独的进程。对于像这样的嵌入,它看起来表现得相当好——总是正常返回,从不调用exit()——尽管您可能很难获得超出返回码的错误信息。 (但您也无法通过system() 获得该信息)。

【讨论】:

  • 是的,我只需要嵌入式系统的busybox。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-02-09
  • 2023-03-09
  • 2016-01-06
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
相关资源
最近更新 更多