Lab2: add quiz solution
This commit is contained in:
parent
e597100f71
commit
1533e51ccc
1 changed files with 73 additions and 0 deletions
73
lab2/solution_2.c
Normal file
73
lab2/solution_2.c
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* This code is identical to running
|
||||||
|
* cat $1 | sort | uniq
|
||||||
|
* in bash
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
|
||||||
|
void run_cat(char* filename, int pfd[2]) {
|
||||||
|
dup2(pfd[1], STDOUT_FILENO);
|
||||||
|
close(pfd[0]);
|
||||||
|
close(pfd[1]);
|
||||||
|
|
||||||
|
char cmd[] = "/usr/bin/cat";
|
||||||
|
char *args[] = {"cat", filename, NULL};
|
||||||
|
execve(cmd, args, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void run_sort(int pfd1[2], int pfd2[2]) {
|
||||||
|
dup2(pfd1[0], STDIN_FILENO);
|
||||||
|
dup2(pfd2[1], STDOUT_FILENO);
|
||||||
|
close(pfd1[0]);
|
||||||
|
close(pfd1[1]);
|
||||||
|
close(pfd2[0]);
|
||||||
|
close(pfd2[1]);
|
||||||
|
|
||||||
|
char cmd[] = "/usr/bin/sort";
|
||||||
|
char *args[] = {"sort", NULL};
|
||||||
|
execve(cmd, args, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void run_uniq(int pfd[2]) {
|
||||||
|
dup2(pfd[0], STDIN_FILENO);
|
||||||
|
close(pfd[0]);
|
||||||
|
close(pfd[1]);
|
||||||
|
|
||||||
|
char cmd[] = "/usr/bin/uniq";
|
||||||
|
char *args[] = {"uniq", NULL};
|
||||||
|
execve(cmd, args, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void check_args(int argc, char** argv) {
|
||||||
|
if (argc != 2) {
|
||||||
|
printf("Usage: %s <filename>\n", argv[0]);
|
||||||
|
_exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
int pfd1[2];
|
||||||
|
pipe(pfd1);
|
||||||
|
|
||||||
|
int pid = fork();
|
||||||
|
|
||||||
|
if (pid == 0) {
|
||||||
|
run_cat(argv[1], pfd1);
|
||||||
|
} else {
|
||||||
|
close(pfd1[1]);
|
||||||
|
|
||||||
|
int pfd2[2];
|
||||||
|
pipe(pfd2);
|
||||||
|
|
||||||
|
int pid2 = fork();
|
||||||
|
|
||||||
|
if (pid2 == 0) {
|
||||||
|
run_sort(pfd1, pfd2);
|
||||||
|
} else {
|
||||||
|
close(pfd1[0]);
|
||||||
|
run_uniq(pfd2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue