/* * SPDsoft: NOT * * exit ! process */ #include #include #include #include int launch( char *cmd[], int *status ); extern int errno; char *app; main(int argc, char **argv ) { int error, status; if (argc < 2 ) { fprintf(stderr,"%s: SPDsoft 1994\n", argv[0]); fprintf(stderr,"Use %s: Cmd [arg...]\n", argv[0]); exit(0); } app = argv[0]; if(0==(error=launch( &argv[1], &status))) { exit(status==0); } else { fprintf(stderr,"%s: %s failed (%d)\n", argv[0],argv[2],error); exit(0); } } int launch( char *cmd[], int *status ) { int res=0; int st; int pid, wpid; switch ( pid = fork() ) { case -1: /* error */ perror ( "fork" ); res = -1; break; case 0: execvp ( cmd[0], &cmd[0] ); fprintf(stderr, "%s: execvp %s: %s\n", app, cmd[0], strerror(errno)); exit(-2); break; default: *status = 0; /* esperando un final */ while ( pid !=(wpid= wait ( &st )) ) ; if (WIFSTOPPED(st)) { fprintf(stderr,"%s: %s stoped %d\n", app, cmd[0], WSTOPSIG(st)); res = -1; } else if(WIFEXITED(st)) { *status = WEXITSTATUS(st); } else if(WIFSIGNALED(st)) { fprintf(stderr,"%s: %s signaled %d\n", app, cmd[0],WTERMSIG(st)); res = -6; } if(st&0200) fprintf(stderr,"%s: %s core dumped\n", app, cmd[0]); break; } /* Fin del switch */ return res; }