2013-09-09 2 views
1

Привет всем Я должен запустить двоичный файл с помощью C++ и убить его.Вилка Как убить Процесс с PID

Мой код выглядеть

static int PROCESS_PID=0; 

void startService(bool startservice){ 

if(startservice==true){ 
pid_t PID = fork(); 
if(PID == 0) { 
    PROCESS_PID = getpid(); 
    printf("the child's pid is: %d\n", PROCESS_PID); 
    system("./process"); 
} 
} 

else{ 
kill(PROCESS_PID, SIGUSR1); //kill process inside child process 
} 

} 

Но когда я убить процесс всей программы получить возбужденное. Любая идея? Что-то не так с моим кодом?

Спасибо ....

ответ

3

Когда вы звоните system(), вы начинаете третий процесс - тот, на который у вас нет pid. Вместо этого используйте exec().

хуже, хотя, ваш kill() вызов выполняется только в том случае, startservice!=true, и в этом случае PROCESS_PID==0 ... так что вы процесс 0 (который будет посылать сигнал на всех процессов в текущей группе процессов убийства).

+0

На самом деле я использовал exec() вместо system(), но не работал – Haris

+0

Два вызова не эквивалентны; один из них не заменяет другого ... так что ваш рабочий процесс - это не обход, который отвечает вашим потребностям. Опубликуйте (в новом вопросе) вашу реальную проблему, сбой exec, так что реальная проблема может быть решена. – mah

+0

Хорошо, я отправлю новый вопрос ... Спасибо за ответ ... – Haris

1

Причина это не работает, потому что вы дважды fork() ING, а system() выполнит fork()/exec() для того, чтобы выполнить команду, которую вы хотите запустить.

Если вы хотите улучшить контроль над дочерним процессом (в том числе убить его), напишите свою собственную версию system(), где вы сами выполните команды fork() и exec().

Есть много примеров того, как это сделать в Интернете.

+0

На самом деле я использовал exec() вместо system(), но не работал – Haris

+1

@Haris Тогда ваш вопрос должен сосредоточиться на * том * коде, а не на коде, который вы отправили. – trojanfoe