在这种情况下使用perror?

我写了一个小程序(带有来自SO的代码),它做了printenv | sort | less printenv | sort | less 现在我想用perror添加error handling并检查返回值。 我之前从未这样做过,但我认为它类似于exception处理。 我需要检查execvp,fork,pipe和dup2的错误。 我有这个代码

 #include  #include  #include  #include  #include  #include  struct command { const char **argv; }; /* Helper function that spawns processes */ int spawn_proc (int in, int out, struct command *cmd) { pid_t pid; if ((pid = fork ()) == 0) { if (in != 0) { dup2 (in, 0); close (in); } if (out != 1) { dup2 (out, 1); close (out); } return execvp (cmd->argv [0], (char * const *)cmd->argv); } return pid; } /* Helper function that forks pipes */ int fork_pipes (int n, struct command *cmd) { int i; int in, fd [2]; for (i = 0; i  1) { /* I'd like an argument */ if (strncmp(argv[1], "cd", 2) && strncmp(argv[1], "exit", 2)) { char *tmp; int len = 1; for( i=1; i<argc; i++) { len += strlen(argv[i]) + 2; } tmp = (char*) malloc(len); tmp[0] = '\0'; int pos = 0; for( i=1; i<argc; i++) { pos += sprintf(tmp+pos, "%s%s", (i==1?"":"|"), argv[i]); } const char *printenv[] = { "printenv", 0}; const char *grep[] = { "grep", "-E", tmp, NULL}; const char *sort[] = { "sort", 0 }; const char *less[] = { "less", 0 }; struct command cmd [] = { {printenv}, {grep}, {sort}, {less} }; return fork_pipes (4, cmd); free(tmp); } else if (! strncmp(argv[1], "cd", 2)) { /* change directory */ printf("change directory to %s\n" , argv[2]); chdir(argv[2]); } else if (! strncmp(argv[1], "exit", 2)) { /* change directory */ printf("exit\n"); exit(0); } } exit(0); } 

那么请你告诉我如何编写perror用法。 我想我应该添加如下代码

 if( -1 == return_value ) { perror( "Program failed" ); exit( 1 ); } 

但我不确切知道如何。

例如,就像你说的那样

 int spawn_proc (int in, int out, struct command *cmd) { pid_t pid; if ((pid = fork()) == 0) { if (in != 0) { if (dup2(in, 0) < 0) { perror("dup2 failed"); exit(1); } close(in); } if (out != 1) { if (dup2(out, 1) < 0) { perror("dup2 failed"); exit(1); } close(out); } if (execvp(cmd->argv [0], (char * const *)cmd->argv) < 0) { perror("execvp failed"); exit(1); } } else if (pid < 0) { perror("fork failed"); exit(1); } return pid; }