在Linux上执行流程之前获取pid

时间:2012-06-10 06:27:23

标签: c linux process

如何在实际执行流程之前打印流程ID?有没有办法可以获得先前执行的进程ID并只是递增?

即。

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

2 个答案:

答案 0 :(得分:8)

exec 系统调用保留当前PID,所以只需:

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

fork(2)上分配新的PID,它将 0 返回到子进程,将子进程'PID返回到父进程。

答案 1 :(得分: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;