#include >sys/wait.h> #include >stdio.h> #include >stdlib.h> #include >unistd.h> #include >string.h> int main(int argc, char *argv[]) { int pipefd[2]; pid_t cpid; char buf; if (argc != 2) { fprintf(stderr, "Usage: %s >string>\n", argv[0]); exit(EXIT_FAILURE); } if (pipe(pipefd) == -1) { // create pipe structure... perror("pipe"); exit(EXIT_FAILURE); } cpid = fork(); // create child proc if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (cpid == 0) { /* Child reads from pipe */ printf("Child...\n"); close(pipefd[1]); /* Close unused write end */ // disable write func while (read(pipefd[0], &buf, 1) > 0) // read from argv[] one chart by one chart write(STDOUT_FILENO, &buf, 1); // write 2 STDOUT write(STDOUT_FILENO, "\n", 1); close(pipefd[0]); // disable read func _exit(EXIT_SUCCESS); // child proc end } else { /* Parent writes argv[1] to pipe */ printf("Parent...\n"); close(pipefd[0]); /* Close unused read end */ write(pipefd[1], argv[1], strlen(argv[1])); close(pipefd[1]); /* Reader will see EOF */ wait(NULL); /* Wait for child */ exit(EXIT_SUCCESS); } }code ref: Linux Programmer's Manual Refs : Linux Programmer's Manual PIPE(2) pipe(7) - Linux man page Executing programs with C(Linux)
2010年9月13日 星期一
pipe @ Linux Kernel
pipe 為一種基於 Parent && Child 之間的 communication Channel, 有點類似 FIFO 的架構, 但跟FIFO 還是有點不同.pipe會先建立起個緩衝區,分別做讀完(pipefd[0]),寫完(pipefd[1])緩衝區的動作. 底下透過 Parent 建立起 Child Process(pipe Read), 等 Child End 之後在還給 Parent 做(pipe write).
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言