Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <sys/wait.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <signal.h>
- int
- check(int status) {
- return WIFEXITED(status) == 1 && WEXITSTATUS(status) == 0;
- }
- int
- main(int argc, char **argv) {
- int fd[2];
- int past = -1, st;
- int *waits = calloc(argc - 1, sizeof(int));
- for (int j = 1; j < argc; ++j) {
- pipe(fd);
- if (!(waits[j - 1] = fork())) {
- if (j > 1 && j < argc - 1) {
- dup2(past, 0);
- if (close(past) == -1) {
- for (int i = 0; i < j - 1; ++i) {
- kill(waits[i], SIGKILL);
- }
- free(waits);
- exit(1);
- }
- dup2(fd[1], 1);
- if (close(fd[1]) == -1) {
- for (int i = 0; i < j - 1; ++i) {
- kill(waits[i], SIGKILL);
- }
- free(waits);
- exit(1);
- }
- } else if (j == 1) {
- if (j != argc - 1) {
- dup2(fd[1], 1);
- if (close(fd[1]) == -1) {
- for (int i = 0; i < j - 1; ++i) {
- kill(waits[i], SIGKILL);
- }
- free(waits);
- exit(1);
- }
- }
- } else {
- dup2(past, 0);
- if (close(past) == -1) {
- for (int i = 0; i < j - 1; ++i) {
- kill(waits[i], SIGKILL);
- }
- free(waits);
- exit(1);
- }
- }
- execlp(argv[j], argv[j], NULL);
- for (int i = 0; i < j - 1; ++i) {
- kill(waits[i], SIGKILL);
- }
- free(waits);
- exit(1);
- } else if (waits[j - 1] == -1) {
- for (int i = 0; i < j - 1; ++i) {
- kill(waits[i], SIGKILL);
- }
- exit(1);
- }
- if (past != -1) {
- if (close(past) == -1) {
- for (int i = 0; i < j - 1; ++i) {
- kill(waits[i], SIGKILL);
- }
- free(waits);
- exit(1);
- }
- }
- past = fd[0];
- if (close(fd[1]) == -1) {
- for (int i = 0; i < j - 1; ++i) {
- kill(waits[i], SIGKILL);
- }
- free(waits);
- exit(1);
- }
- }
- while (wait(&st) > 0){
- if(!check(st)){
- return 1;
- }
- }
- free(waits);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement