我正在实现多级管道流程。为了避免竞争条件,我必须在父进程和子进程中为子进程设置进程组。但是,如果子进程已进入 execvp
,则父进程中的 setpgid
可能会引发错误。
- 是否有任何经验法则表明我们应该在任何系统调用引发错误时退出程序?
- 我可以捕捉到这样的错误并继续我的程序吗?
- 这是一个好的编码约定吗?
- 有没有更优雅的方法来处理这种情况?
#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");
}
最佳答案
关于c - 如果我的系统调用引发错误,是否可以容忍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48602730/