2013-09-24 3 views
0

나는 명령을 실행하고 cmd와 같은 결과를 리턴해야한다.pop에 의해 생성 된 processID를 어떻게 얻을 수 있습니까?

난 그냥이 요구 사항에 대한 유일한 방법을 발견했다. 나는 명령을 실행하고 결과를 반환하는 데 popen 함수를 사용하고 스트림과 프로세스를 닫으려면 pclose() 함수를 사용합니다.

그러나 "ping 8.8.8.8 -t"와 같이 명령이 끝나지 않으면 pclose() 함수를 사용하여 프로세스를 닫을 수 없습니다.

작업 관리자가 popen()에 의해 생성 된 하위 프로세스를 강제 종료하면 pclose 함수가 정상적으로 작동합니다.

popen이 작성한 processID를 제거하려면 어떻게해야합니까?

===================
그리고 : 나는 창에() _popen 사용하는 경우
, 제가 PID를 얻기 위해해야 ​​할 것인가?

답변

0

popen()은 execve() 또는 다른 exec 함수를 사용하여 작성됩니다.

당신이하는 일은 (1) 두 개의 파일 설명자를 제공하는 파이프 쌍을 만드는 것입니다. 하나는 stdin 용이고 다른 하나는 stdout 용입니다. 그런 다음 하위 프로세스에서 fork() 및 execve()를 수행합니다. fork()를 호출 할 때 자식 프로세스를 얻습니다.

popen()이 반환하는 파일은 FILE *이므로 fdopen()을 수행해야하는 pipe()에서 가져옵니다. 그리 어렵지 않습니다. 작품의 아주 조금,하지만 당신은 MS-Windows에서 식별자 ... 이제

을 ... 필요하면, 즉 조금 다르다

, 당신은 CreatePipe()와 CreateProcess를() 또는를 사용하려면 유사한 기능. 그러나 그 결과는 비슷합니다.

0

사용

ps -o user,pid,ppid,command -ax | grep <process name> 

모든 자식 프로세스 정보를 얻을 수 있습니다. 사실 popen()은 pipe()를 사용하여 명령을 실행합니다. 상기 매뉴얼 페이지

popen() 것은 명확는 popen이는 popen() 함수를 처리 execl 함수와 파이프와 포크를 사용한다는 통계

 The environment of the executed command will be as if a 
child process were created within the popen() call using 
fork(2). If the application is standard-conforming (see 
standards(5)), the child is invoked with the call: 

execl("/usr/xpg4/bin/sh", "sh", "-c",command, (char *)0); 

otherwise, the child is invoked with the call: 

execl("/usr/bin/sh", "sh", "-c",command, (char *)0); 

The pclose() function closes a stream opened by popen() by 
closing the pipe. It waits for the associated process to 
terminate and returns the termination status of the process 
running the command language interpreter. This is the value 
returned by waitpid(3C). 

을 매뉴얼 페이지를 참조. 그래서 ps와 aux를 사용하여 모든 자식 프로세스 정보를 얻을 수 있습니다. 내 프로젝트가 많은 경우

+0

아니 사람이 갈등한다 같은 이름을 가진 자식 프로세스. – quanrock

+0

C/C++ 코드에서 명령을 실행하면 exec()와 함께 fork()를 사용해야합니다. – Saravanan

1

wrapp와 자신에 의한는 popen 기능 '파이프 + 포크 + dup2가 + 간부 ('/ 빈/bash는 ','-c ', yourCommandHere)는'

+0

안녕하세요, Windows에서 _popen()을 사용하면 어떻게해야합니까? – quanrock

관련 문제