나는 잠시 후 다시 죽여야 만하는 프로세스를 프로그래밍 방식으로 생성하기 위해 popen2 (stackoverflow의 다른 곳에서 권장되는) 함수를 사용하고 있습니다. popen2는 PID를 반환하고이 PID를 사용하여 프로세스를 종료 할 수 있다고 생각했습니다. 하지만이 방법으로는 작동하지 않습니다. 그것을 죽이려면 반환 된 PID를 증가시켜야하는데 이해할 수 없습니다 (아래 코드 참조)popen2로 만든 살인 프로세스
다양한 스레드가 병렬로이를 수행 할 때 또 다른 문제가 발생할 수 있습니다. 이 경우 경쟁 조건으로 인해 PID가 둘 이상 다를 수 있다고 생각합니다.
내 질문은 : 어떻게 안정적으로 멀티 스레드 시나리오에서 popen2에 의해 만들어진 프로세스의 PID를 식별 할 수 있습니까?
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#define READ 0
#define WRITE 1
pid_t popen2(const char *command, int *infp, int *outfp) {
int p_stdin[2], p_stdout[2];
pid_t pid;
if (pipe(p_stdin) != 0 || pipe(p_stdout) != 0)
return -1;
pid = fork();
if (pid < 0)
return pid;
else if (pid == 0)
{
close(p_stdin[WRITE]);
dup2(p_stdin[READ], READ);
close(p_stdout[READ]);
dup2(p_stdout[WRITE], WRITE);
execl("/bin/sh", "sh", "-c", command, NULL);
perror("execl");
exit(1);
}
if (infp == NULL)
close(p_stdin[WRITE]);
else
*infp = p_stdin[WRITE];
if (outfp == NULL)
close(p_stdout[READ]);
else
*outfp = p_stdout[READ];
return pid;
}
main() {
pid_t pid;
// Create process
pid = popen2("crafty", &in, &out);
sleep(5);
// Why doesn't kill(pid, SIGKILL) work?
kill(pid+1, SIGKILL);
while (1);
}
실제로 popen2가 유효한 PID를 반환합니까? '-1'을 반환하면 오류를 나타낼 수 있습니다. '-1'에서'kill '을 호출하면 시스템 전체를 죽이려고 시도 할 수도 있고 그렇지 않을 수도 있습니다. 반대로'0'에서'kill'은 프로세스 그룹을 죽일 것입니다 : 프로세스와 그것의 자식들입니다. –
예, 반환 된 PID가 유효한지 확실합니다. – chessweb