2016-03-14 7 views
1

Коротко: существует огромное приложение Linux с большим количеством дочерних процессов, и мне нужно что-то вроде этого:Временные отключение дочерние процессы из родительского терминала во время выполнения

/* parent process, far from fork*/ 
suppress_child_output_to_parent_tty(); 

printf("important message"); 
/* huge piece of code */ 
printf("important message"); 

restore_child_output_to_parent_tty(); 

Я знаю, что существует стандартный способ сделать это по

  • макияж трубы,
  • вилки, перенаправлять STDOUT в эту трубу,
  • выберите & чтение трубы/запись в родительский стандартный вывод в некотором цикле в другом потоке,
  • вручную приостановить эту петлю при необходимости

Но я должен НЕТ длительное использование живых потоков для того, мою работу приложений в нескольких случаев с многие многопоточные дочерние процессы, и есть некоторые проблемы с планировщиком ОС, действительно, я должен экономить потоки процессора. И поэтому я ищу несколько элегантных ОС для блочного дочернего STDOUT.

Что я могу сделать?

+1

Вы хотите, чтобы дочерний процесс работал, когда «огромный кусок кода» работает, или временно приостанавливает его решение? – Joni

+0

Да, приостановка детского процесса приемлема. – Jettatura

ответ

2

Это невозможно напрямую: если вы fork(), описатели файла ребенка указывают на то же описания файлов как на родителя. В точке зрения операционной системы нет разницы в родительском доступе к файловому дескриптору и дочернему элементу доступа. Есть способы обойти это (например, прикрепляя отладчик к ребенку), но они действительно сложны.

Самый простой способ, вероятно, приостановить ребенка и возобновить его:

kill(child, SIGSTOP); 

printf("important message"); 
/* huge piece of code */ 
printf("important message"); 

kill(child, SIGCONT); 

Это не представляется возможным для ребенка игнорировать SIGSTOP по дизайну. Когда первый вызов kill() завершается успешно, вы можете с уверенностью предположить, что ребенок остановился. Он продолжается по вызову SIGCONT. Обратите внимание, что по дизайну возможно, что другой процесс продолжит ваш ребенок, прежде чем вы захотите, но вы ничего не можете с этим поделать.

Обратите внимание, что вы можете получить SIGCHLD, если вы остановите свой ребенок, в зависимости от того, как вы настроили обработчик сигнала. Убедитесь, что вы все правильно настроили и прочитали соответствующую документацию.

+0

потрясающий! Спасибо. – Jettatura