2016-11-21 1 views
0

nmap과 C를 사용하여 간단한 네트워크 스캐닝 기능을 만들고 있습니다. popen()을 사용하여 nmap을 실행하고 싶지만, nmap을 실행하려면 30 초가 걸립니다. 다양한 IP를 제공합니다.popen()으로 느린 프로세스 실행

그래서 명령 실행이 완료되었는지 확인하는 방법이 있습니까? 나는 C 코드를 시스템 호출에 걸기를 원하지 않는다. 대신 popen/nmap이 끝났을 때 알 수있는 플래그 나 무언가를 내 C 프로그램의 다른 부분이 오지 않도록 확인하고 싶다. 정지. 이것이 가능한가??

감사합니다.

+2

물론 가능합니다. 지금까지 시도한 것은 무엇입니까? ['fork (2)'] (http://man7.org/linux/man-pages/man2/fork.2.html)을 사용해 보셨습니까? 직접? –

+0

'SIGCHLD' 시그널은 자식 프로세스를 종료 할 때 부모 프로세스로 보내집니다. –

+0

@iharob 포크를 시도하지는 않았지만 내 마음은 이미 pthreads쪽으로 기울어 져 있었으므로 그 길을 택할 것입니다. 감사합니다. – Dark

답변

2

내가 그것을

  1. 당신은 fork() 직접 다음 두 프로세스를 전달하는 방법을 설정할 수 있습니다 할 수있는이 직접 방법을 생각 할 수 있습니다, 이것은 매우 어렵다.

  2. pthread_create()으로 새 스레드를 만들고 거기에 popen()을 호출하면 적절한 잠금 메커니즘을 사용하여 경쟁 조건을 방지하여 훨씬 쉽게 스레드간에 데이터를 공유 할 수 있습니다.

+0

옳은 대답은 3.'posix_spawn()/posix_spawnp()'입니다. – EOF

+0

@iharob 나는 가장 단순한 스레딩을 처음 접했을 때 몇 가지 장애물을 겪고있다. 내 주요 질문은 지금, 어떻게 내 스레드가 popen의 출력을 엉망으로 괜찮은지 알 수 있도록 실행을 마쳤다는 것을 알 수 있습니까? – Dark

+0

이것은 매우 광범위한 질문입니다. 도움이 더 필요하면 [email protected]으로 전자 메일을 보내주십시오. –

0

당신은 fork (hardmode)와 다중 처리를 사용할 수 있습니다

아니면

어느 하나가 한 번에 2 일을 수행 할 수 있습니다 pthread (easymode)를 사용하여 멀티 스레딩 사용할 수 있습니다. 다중 프로세스는 내부 프로세스 통신 (파이프)에 대해 걱정해야하고 수행하려는 두 가지 작업이 메모리를 공유 할 수 없기 때문에 어렵습니다.

멀티 스레딩은 라이브러리 (-lpthread)를 포함하고 별도의 스레드에 어떤 기능이 있는지 지정하기 만하면되므로 훨씬 쉽습니다. IPC는 쉬운 문제가 아니기 때문에

+0

외부 프로그램을 실행하는 것에 관한 질문을 감안할 때 스레드와 프로세스를 사용하는 것이 상대적으로 어렵다는 것은이 답변에서 제시하는 것과는 다소 다릅니다. – EOF

관련 문제