2012-06-10 3 views
2

Как мне начать печать идентификатора процесса до того, как процесс будет фактически выполнен? Есть ли способ получить ранее выполненный идентификатор процесса и просто увеличить его?Получение pid до выполнения процесса в Linux

т.е.

printf(<process id>); 
execvp(process->args[0], process->args); 
+1

Зачем вам это нужно? – obo

+2

@obounaim, это на самом деле то, как вы знаете PID для детей, чтобы вы знали, что с ними делать. Fork() возвращает PID дочернего элемента, который сохраняется в exec –

ответ

8

Exec семейство системных вызовов сохранить текущий PID, так что просто сделать:

if(fork() == 0) { 
    printf("%d\n", getpid()); 
    execvp(process->args[0], process->args); 
} 

Новый ИДП выделяются на вилке (2), который возвращает для дочернего процесса и дочернего процесса "PID для родителя.

+1

Итак, я думаю, это, вероятно, не то, что @Milk после (предположительно PID разветвленного процесса) - то, что даже ядро ​​не знает, пока вы не запустите вилку. – mgiuca

+0

@mgiuca Я сделал это более очевидным *, когда * ** вилка (2) ** происходит ... –

+1

О, верно (я тоже пропустил эту деталь, спасибо за редактирование). – mgiuca

2

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

int fd[2] = {0, 0}; 
char buf[256] = {0}; 
int childPid = -1; 

if(pipe(fd) != 0){ 
    printf("pipe() error\n"); 
    return EXIT_FAILURE; 
} 

pid_t pid = fork(); 
if(pid == 0) { 
    // child process 
    close(fd[0]); 
    write(fd[1], getpid(), sizeof(int)); 
    execvp(process->args[0], process->args); 
    _exit(0) 
} else if(pid > 0){ 
    // parent process 
    close(fd[1]); 
    read(fd[0], &childPid, sizeof(childPid)); 
} else { 
    printf("fork() error\n"); 
    return EXIT_FAILURE; 
} 
printf("parent pid: %d, child pid: %d\n", getpid(), childPid); 
return 0; 
Смежные вопросы