You don't need named pipes; unnamed pipes work just fine. Actually, often you can just use popen
instead of doing the pipe
/fork
/dup
/exec
yourself. popen
works like this (though your libc
's implementation likely has more error checking):
FILE *popen(const char *command, const char *type) {
int fds[2];
const char *argv[4] = {"/bin/sh", "-c", command};
pipe(fds);
if (fork() == 0) {
close(fds[0]);
dup2(type[0] == 'r' ? 0 : 1, fds[1]);
close(fds[1]);
execvp(argv[0], argv);
exit(-1);
}
close(fds[1]);
return fdopen(fds[0], type);
}
This creates an unnamed pipe, and fork
s. In the child, it reattaches stdout (or stdin) to one end of the pipe, then exec
s the child. The parent can simply read (or write) from the other end of the pipe.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…