讀管道:
1、進程從管道中讀取數據時,進程被掛起直到數據被寫進管道。(如果管道被兩個進程共享,進程A關閉了讀端,進程B讀寫都開啟,B使用讀端時,會一直等待B進程的寫端的動作,而不會理會A的動作。)
2、當所有的寫者關閉了管道的寫數據端時,試圖從管道中讀取數據的調用返回0,意味著文件結束。
3、管道是一個隊列。一個進程從管道中讀取數據後,數據已經不存在了。如果兩個進程都試圖對同一個管道進行度操作,在一個讀取一些之後,另一個進程讀到的將是後面的內容。他們讀到的數據必然是不完整的,除非兩個進程用某種方式來協調它們對管道的訪問。
寫管道:
1、管道容納的數據量是有限的,比磁盤文件差很多。如果進程想寫入1000個字節,而管道只能容納500個,那麼寫入調用只能等待,直到管道中再有500個字節。
2、當所有讀者都關閉讀數據端,則寫操作失敗。首先內核發送SIGPIPE消息給進程。若進程被終止,則無任何事情發生,否則write調用返回-1,並且將errno置為EPIPE。
3、POSIX標准規定內核不會拆分小於512字節的塊。而Linux則保證管道中可以存在4096字節的連續緩存。如果兩個進程向管道寫數據,並且每一個進程都限制其消息不大於512字節,那麼這些消息都不會被內核拆分。
這個示例程序,簡單地展示了管道的使用:
- /*
- * @FileName: pipedemo.c
- * @Author: wzj
- * @Brief:
- *
- * @History:
- *
- *
- *
- * @Date: 2011年10月04日星期二18:55:23
- *
- */
- #include<stdio.h>
- #include<unistd.h>
- #include<stdlib.h>
- #include<string.h>
- #include<fcntl.h>
-
- int main()
- {
- int len, i, apipe[2];
- char buf[BUFSIZ];
- int tmfd;
-
- // tmfd = open("/etc/passwd", O_RDONLY);
- // dup2(tmfd, 2); // redirect output...
- // close(tmfd);
- // close(0); // can't get the input...
- // close(1); // can't output...
-
- close(2);
- /*get a pipe*/
- if(pipe(apipe) == -1)
- {
- perror("could not make pipe");
- exit(1);
- }
-
- printf("Got a pipe ! It is file descriptors: \
- { %d %d} BUFSIZE:%d\n", apipe[0], apipe[1], BUFSIZ);
-
- /*read from stdin, write into pipe, read from pipe, print*/
- while(fgets(buf, BUFSIZ, stdin))
- {
- len = strlen(buf);
- if(write(apipe[1], buf, len) != len)
- {
- perror("writing to pipe");
- break;
- }
-
- for(i=0; i<len ; i++)
- {
- buf[i] = 'X';
- }
- len = read(apipe[0], buf, BUFSIZ);
- if(len == -1)
- {
- perror("reading from pipe");
- break;
- }
-
- if(write(1, buf, len) != len)
- {
- perror("writing to stdout");
- break;
- }
- }
-
- return 0;
- }