Как запустить pid программы с помощью fork и execv

В этой программе я запускаю другой процесс с помощью 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 запущенной программы?


person node ninja    schedule 27.04.2011    source источник


Ответы (4)


Он возвращается вызовом 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.

person Wyzard    schedule 27.04.2011

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

person Nicholas Riley    schedule 27.04.2011

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

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

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

person Greg Hewgill    schedule 27.04.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 и делать то, что хотите, в зависимости от того, находитесь ли вы в дочернем или родительском.

person Oscar Mederos    schedule 27.04.2011