379_demos/lab2/demos/w2wc.c
2024-09-24 15:52:03 -06:00

51 lines
897 B
C

/*
* This code is identical to running
* w | wc -w
* in bash
*/
#include <stdio.h>
#include <unistd.h>
void child(int pfd[2]) {
close(pfd[1]);
dup2(pfd[0], STDIN_FILENO);
close(pfd[0]);
char cmd[] = "/usr/bin/wc";
char *args[] = {"wc", "-w", NULL};
if (execve(cmd, args, NULL) == -1) {
perror("wc error!");
}
}
void parent(int pfd[2]) {
close(pfd[0]);
dup2(pfd[1], STDOUT_FILENO);
close(pfd[1]);
char cmd[] = "/usr/bin/w";
char *args[] = {"w", NULL};
if (execve(cmd, args, NULL) == -1) {
perror("w error!");
}
}
int main (void) {
int pfd[2];
if (pipe(pfd) < 0) {
perror("pipe error!");
_exit(1);
}
int pid = fork();
if (pid < 0) {
perror("fork error!");
_exit(1);
}
if (pid == 0) { // child
child(pfd);
} else {
parent(pfd);
}
}