有名管道的應用實例,創建兩個有名管道實現全雙工通信,兩個進程間的聊天


創建兩個有名管道來實現不同進程間的全雙工通信。

兩個進程聊天程序:一個server端,一個client端。

例子用到了read函數:

read函數只是一個通用的讀文件設備的接口。是否阻塞需要由設備的屬性和設定所決定。一般來說,讀字符終端、網絡的socket描述字,管道文件等,這些文件的缺省read都是阻塞的方式。

如果是讀磁盤上的文件,一般不會是阻塞方式的。但使用鎖和fcntl設置取消文件O_NOBLOCK狀態,也會產生阻塞的read效果。

server端:

 

#include <stdio.h> #include <unistd.h> #include <strings.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>


#define FIFO_WRITE "readfifo"
#define FIFO_READ "writefifo"
#define LEN       300

int main(int argc, char* argv[]) { char buf[LEN]; char readbuf[LEN]; int wfd; int rfd; int len; mkfifo(FIFO_WRITE, S_IFIFO|0666); rfd = open(FIFO_READ, O_RDONLY); wfd = open(FIFO_WRITE, O_WRONLY); while(1) { bzero(readbuf, LEN); len = read(rfd, readbuf, LEN); printf("len=%d\n", len); if (len > 0) { readbuf[len] = '\0'; printf("client: %s\n", readbuf); if (strncmp("quit", readbuf, strlen(readbuf)) == 0) { break; } } bzero(buf, LEN); printf("server: "); fgets(buf, LEN, stdin); buf[strlen(buf)-1] = '\0'; write(wfd, buf, strlen(buf)); } close(wfd); unlink(FIFO_WRITE); close(rfd); return 0; }

 

 

 

client端:

 

#include <stdio.h> #include <unistd.h> #include <strings.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>


#define FIFO_READ "readfifo"
#define FIFO_WRITE "writefifo"
#define LEN       300

int main(int argc, char* argv[]) { char buf[LEN]; char readbuf[LEN]; int wfd; int rfd; int len; mkfifo(FIFO_WRITE, S_IFIFO|0666); wfd = open(FIFO_WRITE, O_WRONLY); rfd = open(FIFO_READ, O_RDONLY); while(1) { bzero(buf, LEN); printf("client: "); fgets(buf, LEN, stdin); buf[strlen(buf)-1] = '\0'; write(wfd, buf, strlen(buf)); printf("buf:%s\n", buf); if (strncmp("quit", buf, strlen(buf)) == 0) { break; } bzero(readbuf, LEN); len = read(rfd, readbuf, LEN); if (len > 0) { readbuf[len] = '\0'; printf("server: %s\n", readbuf); } } close(wfd); unlink(FIFO_WRITE); close(rfd); return 0; }

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM