LINUX.ORG.RU

Аналог winapi CreateProcess под Linux

 ,


1

1

Привет всем!

Виндовый CreateProcess работает следующим образом:

1) Запускается родительский процесс 2) Запускается дочерний процесс 3) Далее завершение процессов:

3-a) если родитель умирает , ребенок продолжает работать

3-b) если ребенок умирает , родитель получает код завершения работы ребенка

Что я смог нарыть под Linux:

если

fork + exec , то выполняется только пункт 3-b

если

fork + fork + exec , то выполняется только пункт 3-a

Можно ли сделать так , чтобы выполнялись оба пункта (3-a и 3-b)?


fork + exec , то выполняется только пункт 3-b

3-a должно выполняться, просто дочернему процессу может придти сигнал в обработчик по умолчанию и он завершится.

mky ★★★★★
()
Ответ на: комментарий от mky

Спасибо за ответ! Из вашего сообщения я понял, что что-то сделать можно , но вот как...

Допустим я из своего приложения в отдельном потоке запустил стандартный калькулятор с помощью fork+exec . Я хочу чтобы калькулятор жил после завершения работы моей программы. Либо если завершался калькулятор , я хочу получить его код завершения.

Где можно почитать об этом или еще лучше пример кода на СИ ?

P.S. Я совсем недавно на Linux (15 лет на винде), поэтому прошу отнестись с пониманием.

morm
() автор топика
Ответ на: комментарий от morm

Есть системный вызов sigaction, и соответствующая ему функция sigaction в libc, которая позволяет задавать действие при получении определенных сигналов.

ЕМНИП, в твоем случае дочерний процесс получает SIGHUP, и этот сигнал можно обработать.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Всех благодарю сердечно! И книгу посоветовали и пример дали и советы. Пойду разбираться.

morm
() автор топика

3-a) если родитель умирает , ребенок продолжает работать
3-b) если ребенок умирает , родитель получает код завершения работы ребенка

fork + exec , то выполняется только пункт 3-b

нет же, man 2 exit:

The function _exit() terminates the calling process
"immediately". Any open file descriptors belonging to the
process are closed.  Any children of the process are inherited
by init(1) (or by the nearest "subreaper" process as defined
through the use of the prctl(2) PR_SET_CHILD_SUBREAPER
operation).  The process's parent is sent a SIGCHLD signal.

anonymous
()
Ответ на: комментарий от morm

Для меня стандратный калькулятор это bc, а какой у вас? Опишите подробнее, в GUI или в консоле? Есть завязки на терминал, на ввод/вывод. Если ваш калькулятор обменивается по pipe'ам с родителем, то он может получить SIGPIPE. В общем, между fork и exec можно замаскировать сигналы, но если после exec приложение их размаскирует...

В общем, можно написать своё приложение, которое будет прекрасно жить после смерти родителя, а можно найти такое чужое приложение, в котором автор упоролся и вобще засунул постоянную проверку pid'а родителя и без правки кода ничего не получится.

Может вам нужно будет делать fork + fork + exec, но первый дочерний процесс не выходит, а ждёт exec и возвращает его код завершения.

mky ★★★★★
()
Ответ на: комментарий от mky

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

morm
() автор топика

Из всех API на CreateProcess больше всего похож posix_spawn.

anonymous
()
Ответ на: комментарий от morm

fork+exec — это низкоуровневая реализация, системные вызовы ядра, с помощью которых это делается. Обычно есть более удобные высокоуровневые вызовы, например, system() если нужно просто запустить консольную команду, или popen() если от команды нужно считать вывод.

Где можно почитать об этом или еще лучше пример кода на СИ ?

В стандартном мануале. Команды: man 3 system и man 3 popen.

anonymous
()

daemon() ?

Родитель с ребенком общаются? Если, то как? Кто из них что делает?

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)

Man fork, man wait, man signal до просветления

Nastishka ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.