我必须在启动新实例之前停止先前的进程实例。为此,我需要系统调用或C库调用。
目前我使用"系统(" killall name")。这有效,但我想用任何等效的system(2)/ library(3)调用替换它。有什么选择?
还要从"系统中删除目录中的文件(" rm -f / opt / files *")", 什么是备用库(3)/ system(2)调用? 请注意文件名中的*,通过一次调用删除所有文件。
的问候, AK
答案 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()
得到的。