Как получить pid программы, запущенной с помощью fork и execv - PullRequest
1 голос
/ 27 апреля 2011

В этой программе я запускаю другой процесс с execv.

if (fork() == 0) {
    struct rlimit limits;
    limits.rlim_cur = 10000000; // set data segment limit to 10MB
    limits.rlim_max = 10000000; // make sure the child can't increase it again
    setrlimit(RLIMIT_DATA, &limits);
    execv(...);
}

Как получить pid программы, которая была запущена?

Ответы [ 5 ]

3 голосов
/ 27 апреля 2011

Возвращается вызовом fork() в родительском элементе, поэтому вам нужно захватить возвращаемое значение fork() в переменной.

pid_t child_pid = fork();
if (child_pid == -1) {
  // fork failed; check errno
}
else if (child_pid == 0) {  // in child
  // ...
  execv(...);
}
else {  // in parent
  // ...
  int child_status;
  waitpid(child_pid, &child_status, 0);  // or whatever
}

У ребенка использование execv() не имеет значения; это не меняет pid.

2 голосов
/ 27 апреля 2011

Это возвращаемое значение из fork () в исходном процессе ...

1 голос
/ 27 апреля 2011

То, что вы хотите - это pid процесса, который запускает эту программу.

Сигнатура функции fork следующая:

#include <unistd.h>

pid_t fork(void);

и она возвращает:

  • 0 у ребенка
  • the pid of the child у родителя
  • -1 в случае возникновения ошибки

Еслиесли вы хотите получить pid нового созданного процесса (дочернего), вы должны проверить, больше ли возвращаемое значение, чем 0.

В вашем примере:

pid_t pid = fork()

if (pid == 0) {
    struct rlimit limits;
    limits.rlim_cur = 10000000; // set data segment limit to 10MB
    limits.rlim_max = 10000000; // make sure the child can't increase it again
    setrlimit(RLIMIT_DATA, &limits);
    execv(...);
}
else if (pid > 0) {
    /* That's the value of the pid you are looking for */
}

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

1 голос
/ 27 апреля 2011

Эй, я узнаю этот фрагмент кода.

Мой ответ на ваш предыдущий вопрос был примером того, как использовать setrlimit() в сочетании с fork() и exec(). Он не был задуман как пример complete , и обычно вы сохраняете возвращаемое значение fork() для дальнейшего использования (так как это pid дочернего элемента, который вам здесь нужен).

Пример кода не обязательно является полным кодом.

1 голос
/ 27 апреля 2011
pid_t child;
child = fork();
if (child == 0) {
...