c - perror usage in this case? -


i've written small program (with code so) printenv | sort | less , want add error-handling perror , checking return values. i've never done before suppose similar exception handling. need check errors execvp, fork, pipe , dup2. have code

#include <sys/types.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> struct command {     const char **argv; }; /* helper function 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 forks pipes */ int fork_pipes (int n, struct command *cmd) {     int i;     int in, fd [2];     (i = 0; < n - 1; ++i) {         pipe (fd);         spawn_proc (in, fd [1], cmd + i);         close (fd [1]);         in = fd [0];     }     dup2 (in, 0);     return execvp (cmd [i].argv [0], (char * const *)cmd [i].argv); }  int main (int argc, char ** argv) {     int i;     if (argc == 1) { /* there no arguments */         const char *printenv[] = { "printenv", 0};         const char *sort[] = { "sort", 0 };         const char *less[] = { "less", 0 };         struct command cmd [] = { {printenv}, {sort}, {less} };         return fork_pipes (3, cmd);     }     if (argc > 1) { /* i'd 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 %s\n" , argv[2]);             chdir(argv[2]);         } else if (! strncmp(argv[1], "exit", 2)) { /* change directory */             printf("exit\n");             exit(0);         }     }     exit(0); } 

then can please tell me how write perror usage. suppose should add code following

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

but don't know how.

it's pretty said, example

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; } 

Popular posts from this blog