2013-11-20 2 views
0

Я пытаюсь взаимодействовать с действительно дрянным, полностью непрозрачным API, который создает два подпроцесса в среде, подобной POSIX (OS X/Linux) в C. В принципе, он запускает внешнюю программу и обеспечивает рудиментарную поддержку для передачи сообщений туда и обратно. Дерево процесса выглядит примерно так:Предотвратить отправку SIGINT всем дочерним элементам группы процессов

+ My_program 
\ 
    + an initiation shell script (csh -f -c external_program_startup_script) 
    \ 
    - the external program instance 

Когда я нажимаю Ctrl + C в терминале, а My_program работает, управляющий терминал посылает SIGINT всех процессов в своей группе процессов - все три указанных выше процессов. I хочу SIGINT, чтобы получить экземпляр программы, но если он также попадает в сценарий оболочки, тогда этот средний процесс завершается, и линия связи прерывается.

В пределах My_program я могу настроить обработчик сигнала, чтобы игнорировать SIGINT. Но у меня нет абсолютно никакого контроля над двумя дочерними процессами (API даже не раскрывает их PID), поэтому существующие решения, такие как изменение их группы процессов или привязки обработчиков, не будут работать. Есть ли способ запретить управляющему терминалу отправлять SIGINT ко всем процессам в группе процессов переднего плана?

(API-интерфейс в вопросе MATLAB's libeng, что позволяет внешнюю программу C для обработки команд в MATLAB. Но это не имеет абсолютно никакой функции для отправки прерываний за то, что обеспечивает ОС.)

+0

У меня такое чувство, что я знал ответ на этот вопрос в какой-то момент – Shahbaz

ответ

1

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

+0

У меня нет * никакого * доступа к дочернему процессу. Все разметки скрыты в одном вызове API в библиотеку с закрытым исходным кодом. Использование 'setpgid (child_id, child_id)' из родительских ошибок с разрешенным разрешением. Вот почему я ищу альтернативное решение. –

+1

@MattB Если я правильно понял вас, этот вызов API порождает скрипт инициализации, верно? Если да, просто fork(), в дочернем случае используйте setpgid(), затем вызовите функцию API. После этого вам нужно решить, можете ли вы выйти из этого промежуточного процесса или вам нужно дождаться завершения процесса childer. – ArturFH

+0

@MattB. BTW, вы также можете использовать tcsetpgrp() для настройки управляющего терминала - я полностью забыл об этом. – ArturFH

Смежные вопросы