2016-11-21 4 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

я могу думать о 2-х прямых способов сделать это

  1. Вы можете fork() непосредственно и затем установить способ взаимодействия двух процессов, это было бы очень трудно, потому что IPC не является легким делом.

  2. Вы можете создать новый поток с pthread_create() и позвонить по телефону popen() там, было бы намного проще, и вы могли бы обмениваться данными между потоками, используя соответствующий механизм блокировки для предотвращения условий гонки.

+0

Правильный ответ: 3. 'posix_spawn()/posix_spawnp()'. – EOF

+0

@iharob Я сталкиваюсь с некоторыми блокпостами, так как я новичок даже в самых простых потоках. Мой главный вопрос прямо сейчас: Как я узнаю, что мой поток завершил выполнение, поэтому я знаю, когда нормально работать с выходом Popen? – Dark

+0

Это очень широкий вопрос, если вам нужна помощь, пожалуйста, пришлите мне электронное письмо на адрес [email protected] –

0

Вы можете использовать мульти обработки с fork (hardmode)

Или вы можете использовать многопоточность с помощью pthread (будет легким)

Либо один позволяет сделать 2 вещи сразу. Многопроцессорность сложна, потому что вы должны беспокоиться о связях с внутренними процессами (pipe), а две задачи, которые вы пытаетесь сделать, не могут совместно использовать память.

Многопоточность намного проще, потому что все, что вам нужно, это включить библиотеки (-lpthread), а затем указать, какая функция находится в отдельном потоке.

+0

Учитывая, что вопрос о выполнении внешней программы, относительные трудности использования потоков и процессов несколько отличаются от того, что предлагает этот ответ. – EOF