我正在实施多阶段管道处理。为了避免争用条件,我必须在父进程和子进程中为子进程设置进程组。但是,如果子进程已进入setpgid,父进程中的execvp会引发错误。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#define CHECK(syscall, msg) do { \
if ((syscall) == -1) { \
perror(msg); \
_exit(1); \
} \
} while(0)
int main () {
int ls_pid;
char *ls_argv[] = { "ls", NULL };
CHECK(ls_pid = fork(), "fork error");
if (!ls_pid) {
CHECK(setpgid(0, 0), "setpgid error");
CHECK(tcsetpgrp(STDIN_FILENO, 0), "tcsetpgrp error");
CHECK(execvp(ls_argv[0], ls_argv), "execvp error");
} else {
// sleep(2);
setpgid(ls_pid, ls_pid); // This might give error if the child process has entered execvp.
// It returns -1 if uncommenting the sleep(2) above.
}
CHECK(wait(NULL), "wait error");
printf("Finish\n");
}发布于 2018-02-04 09:51:03
https://stackoverflow.com/questions/48602730
复制相似问题