#include // execvp, fork #include // printf #include // wait #include // open, O_WRONLY int main(int argc, char* argv[]) { if (argc < 2) return 1; pid_t fpid = fork(); if (fpid == 0) { int fi = open(argv[argc-3], O_RDONLY); if (fi < 0) { perror("open"); return 2; } dup2(fi, 0); close(fi); int fo = open(argv[argc-2], O_WRONLY | O_TRUNC | O_CREAT, 0755); if (fo < 0) { perror("open"); return 3; } dup2(fo, 1); close(fo); int fe = open(argv[argc-1], O_WRONLY | O_TRUNC | O_CREAT, 0755); if (fe < 0) { perror("open"); return 4; } dup2(fe, 2); close(fe); char* args[argc-2]; for (int i = 1; i < argc - 2; i++) args[i-1] = argv[i]; args[argc-3] = NULL; execvp(argv[1], args); } else { int status; wait(&status); printf("%d %d\n", fpid, status); } }