首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果我的系统调用引发错误,是否可以容忍?

如果我的系统调用引发错误,是否可以容忍?
EN

Stack Overflow用户
提问于 2018-02-03 22:28:57
回答 1查看 149关注 0票数 3

我正在实施多阶段管道处理。为了避免争用条件,我必须在父进程和子进程中为子进程设置进程组。但是,如果子进程已进入setpgid,父进程中的execvp会引发错误。

  • 如果系统调用引发错误,我们应该退出程序吗?
  • 我能捕捉到这样的错误并继续我的程序吗?
  • 这是一个很好的编码约定吗?
  • 有什么更好的方法来处理这个案子吗?
代码语言:javascript
运行
复制
#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");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-04 09:51:03

我想下面的链接可以很好地回答你的问题:

POSIX,第1部分:错误处理

但我不认为你正在使用一个好的编码约定。它对错误的容忍度很低。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48602730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档