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

时间:2015-04-24 13:16:30

标签: linux system libc kill-process

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

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

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

的问候, AK

2 个答案:

答案 0 :(得分:2)

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

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

至少你可以尝试检查killall本身

的实现方式

来自Ben的链接的一小部分,killall调用以下行,即通过pid函数收集find_pid_by_name相关进程,可以找到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); } } 的实现{ {3}}

@Override
public void stop() {
    System.exit(0);
}

答案 1 :(得分:2)

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

您还可以将busybox作为共享库链接并调用其kill_main,而不是启动单独的进程。它看起来很适合嵌入这样 - 总是正常返回,从不调用exit() - 尽管你可能很难获得超出返回代码的错误信息。 (但你不是通过system()得到的。