Создание дочернего процесса в системах Unix? - PullRequest
0 голосов
/ 28 марта 2010

Я пытаюсь создать дочерний процесс в другом процессе. Я пишу обе программы на языке Си. Сначала я пишу фиктивный процесс, который будет дочерним процессом. Что он делает, это только пишет строку на экране. Это работает хорошо само по себе. Затем я пишу другую программу, которая будет родительским процессом. Однако я не могу этого сделать. Я пытаюсь использовать функции fork и execl вместе, но мне не удается. Я также хочу, чтобы дочерний процесс не завершился, пока не завершится родительский процесс.

Как мне написать родительский процесс?

Спасибо.

Вот код для дочернего процесса:

#include <stdio.h>

int main(void) {
  while(1) {
    printf("*");
    sleep(1);
  }
}

А вот и родительский процесс:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
  if (fork()) {
    while(1) {
      printf("-\n");
      sleep(5);
    }
  } else {
    execl("./", "dummy", (char *)0);
  }
}

Ответы [ 3 ]

6 голосов
/ 28 марта 2010

Системный вызов fork () может возвращать три разных состояния: сбой (<0), родительский процесс (> 0) или дочерний процесс (== 0). Вы должны правильно проверить возвращаемое значение.

int pid = fork();

if (pid < 0) {
  /* handle error */
  perror("fork");
  exit(1);
} else if (pid > 0) {
  /* parent code */
} else {
  /* child code */
}

Ваш системный вызов execl () неверен. Первый аргумент - это путь к программе, которую вы хотите выполнить, «./» недопустим, это должно быть как минимум «./dummy». Следующим аргументом является условное имя команды (argv [0] в исполняемой программе), которое может быть повторением первого аргумента. Итак:

execl("./dummy", "dummy", NULL);

Также обратите внимание, что оператор printf("*") в дочерней программе, вероятно, буферизуется, и вы ничего не увидите в терминале. Вы должны либо добавить «\ n» в конец, либо вызвать fflush(stdout), чтобы очистить стандартный вывод.

1 голос
/ 28 марта 2010

Основное использование вилки в C

int PID = fork();

if( PID < 0 ) {
    //fail
    return PID;
}
else if( !PID ) {
    //child process
    return exec( prog, args );
} 
else {
    //parent process
    return 0;
}
0 голосов
/ 28 марта 2010

Нет способа заставить дочерний процесс "не завершаться", когда он завершен (вы все равно сможете в родительском wait получить для него информацию о том, как он завершился, но это все). Кроме того, любой из множества примеров fork / exec в Интернете, например this , должен работать - почему бы вам не попробовать и не посмотреть, работает ли он так, как вы? желание (в этом случае вам просто нужно изменить то, что вы делали по-другому в вашей собственной попытке). Если он не работает должным образом (за исключением невозможности, описанной в первом предложении этого A ;-), отредактируйте его, чтобы добавить подробные сведения о том, как код ведет себя иначе, чем вы ожидаете.

...