Создать новый независимый процесс из другого процесса C - PullRequest
2 голосов
/ 29 мая 2009

Существует два исполняемых файла C и B. А и Б общаются друг с другом через сокет.

B можно запустить независимо или через A.

  1. Если B запускается первым, а A запускается следующим, то A и B запускаются правильно, без проблем. Даже если A перезапущен, проблем нет.

  2. Если B запускается через A, то A и B запускаются правильно. Но здесь порт связи связан как с A, так и с B. Здесь, если A перезапущен, A не запускается.

Поскольку B запускается через A, процесс A является родителем процесса B.

Итак, есть ли какие-либо средства, с помощью которых процесс B может быть запущен независимо от процесса A?

Мы попытались использовать fork, но с помощью fork, когда мы пытаемся запустить exe, запускается два процесса вместо одного.

Ответы [ 3 ]

3 голосов
/ 29 мая 2009

Вы пытались использовать исполняемый файл-обертку, который разветвляется дважды - один раз для A и один раз для B - и затем убивает себя? В этом случае A и B будут работать как отдельные процессы, которые затем наследуются процессом init и должны быть безопасно перезапущены.

0 голосов
/ 31 мая 2009

Используете ли вы доменный сокет Unix или обычный сетевой сокет?

Какой из процессов, A или B, прослушивает сокет (пассивное открытие), а какой выполняет активное открытие?

Когда вы решите, что A должен запустить B, как код определяет, что это необходимо?

Вы открываете сокет, прежде чем форк и exec?

Мое впечатление от предоставленной информации:

  • Вы используете сетевой сокет
  • B - слушатель

Но я мог легко ошибиться.

Интересно, сталкивались ли вы с проблемами, потому что A уже создал активный сокет до того, как вы выполните fork и exec B, поэтому активный конец сокета не закрывается чисто, когда A завершается, потому что B имеет копию сокета, открытого для записи а также A. Когда вы выполняете ветвление, дочерний процесс должен очистить ненужные файловые дескрипторы (например, сокеты) перед выполнением другого процесса.

0 голосов
/ 30 мая 2009

Вы уверены, что правильно проверяете возвращаемое значение fork () ?

как:

pid_t pid;
if (pid == 0) {
    /* child */
}
else if (pid > 0) {
    /* parent */
}
else {
    /* error */
}
...