killall(1) 等效系统调用或 C 库调用

killall(1) equivalent system call or C library call

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

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

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

此致, AK

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

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

至少你可以尝试检查killall本身是如何实现的


Ben 的 link 的一个小补充,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);
    }
}

您可以在此处查看 busybox 中的实现:http://git.busybox.net/busybox/tree/procps/kill.c

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