2015-04-24 2 views
0

Мне нужно остановить предыдущие экземпляры процессов перед запуском нового экземпляра. Для этого мне нужен системный вызов или вызов библиотеки C.killall (1) эквивалентный системный вызов или вызов библиотеки C

В настоящее время я использую «система (» название killall "). Это работает, но я хочу, чтобы заменить это с какой-либо эквивалентной системой (2)/библиотека (3) называет. Что это вариант?

Кроме того, чтобы удалить файлы из каталога, как в «system (« rm -f/opt/files * »)», Что будет альтернативной библиотекой (3)/системой (2)? Обратите внимание * в именах файлов, удалите все файлы с помощью один вызов.

с уважением, АК

+0

Спасибо за ответ. Как насчет 2-й части - системы («rm -f/tmp/files *»)? –

ответ

2

насколько я знаю, нет никакого общего способа сделать это, так как нет общего способ получить pid по названию процесса.

Вы должны собрать pid х соответствующих процессов и вызвать функцию int kill(pid_t pid, int signo);

По крайней мере, вы можете попробовать, чтобы проверить, как его реализовать с помощью killall сама


Небольшое дополнение от ссылки Бена, killall вызывает следующие линии, т.е. собирает pid с связанного процесса find_pid_by_name функция, реализация которой может быть найден 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); 
    } 
} 
+1

И получить список процессов достаточно прост для кода в C на Linux: 'readdir''/proc/'файловая система. Сосредоточьтесь на подкаталогах с именем, начинающимся с цифры. 'readlink' свою символическую ссылку'/proc/1234/exe' (где 1234 - пример начального числа). –

+1

Точно так же Эрик Андерсен реализовал то же самое. http://git.busybox.net/busybox/tree/libbb/find_pid_by_name.c – deimus

2

Вы можете увидеть реализацию в BusyBox здесь: http://git.busybox.net/busybox/tree/procps/kill.c

Вы также можете связать с BusyBox как разделяемую библиотеку и вызовите его kill_main вместо запуска отдельного процесса. Он выглядит довольно хорошо для такого встраивания - всегда возвращается нормально, никогда не вызывает exit() - хотя вам может быть сложно получить информацию об ошибках за кодом возврата. (Но вы не получите это через system() либо).

+0

Да, мне нужно на busybox только для встроенной системы. Благодарю. –