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
。
你必须收集相关进程的pid
s并调用int kill(pid_t pid, int signo);
函数
至少你可以尝试检查killall
本身是如何实现的
Ben 的 link 的一个小补充,killall
调用以下行,即通过 find_pid_by_name
函数收集相关进程的 pid
s,其实现可以是找到 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()
获得)。
我必须在启动新实例之前停止较早的进程实例。为此,我需要系统调用或 C 库调用。
目前我使用 "system("killall name")。这有效,但我想用任何等效的 system(2)/library(3) 调用替换它。选项是什么?
也从目录中删除文件,如 "system("rm -f /opt/files*")", 备用 library(3)/system(2) 调用是什么? 请注意文件名中的*,一键删除所有文件。
此致, AK
据我所知,没有通用的方法可以做到这一点,因为没有通用的方法可以通过进程名称获取 pid
。
你必须收集相关进程的pid
s并调用int kill(pid_t pid, int signo);
函数
至少你可以尝试检查killall
本身是如何实现的
Ben 的 link 的一个小补充,killall
调用以下行,即通过 find_pid_by_name
函数收集相关进程的 pid
s,其实现可以是找到 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()
获得)。