используя вилку, чтобы сделать что-то, пока ребенок бежит - PullRequest
3 голосов
/ 23 августа 2011

Итак, в основном мне нужно:

pid = fork();
if (pid == -1)
   exit(1);

if (pid == 0)
{
   // do stuff in child
}
else
{
   // ONLY do stuff while child is running
}

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

Ответы [ 5 ]

4 голосов
/ 23 августа 2011

Вы можете использовать waitpid, чтобы узнать, запущен ли дочерний процесс:

int status;
if (waitpid(pid, &status, WNOHANG) == 0) {
    // still running
}

При WNOHANG, waitpid немедленно возвращается, чтобы программа могла сделать что-то еще.

Если вам нечего делать, кроме ожидания завершения дочернего процесса, позвоните waitpid без WNOHANG.

1 голос
/ 23 августа 2011

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

Или вы можете добавить цикл while, который проверяет waitpid в вашем предложении else.Вы будете выполнять отдельные единицы работы между опросами дочернего состояния, и вас не прервут сразу же при выходе из дочернего процесса.

1 голос
/ 23 августа 2011
1 голос
/ 23 августа 2011

Стандартный способ узнать, что дочерний процесс завершен (и получить его код выхода), - это использовать системный вызов waitpid().

0 голосов
/ 23 августа 2011

Используйте системный вызов wait(), если вам просто нужно проверить, не прекратился ли ребенок.

int pid;
int status;
while (true)
{
  pid = wait(&status);
  if (pid < 0)
    //keep waiting
  else if (pid == 0)
    //child is done
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...