【干货】什么是Linux管道?
发布作者:微思网络 发布时间:2017-03-09 浏览量:0次
除了以上局限性,管道还有其他一些不足,如管道没有名字(匿名管道),管道的缓冲区大小是受限制的。管道所传输的是无格式的字节流。这就需要管道输入方和输出方事先约定好数据格式。虽然有那么多不足,但对于一些简单的进程间通信,管道还是完全可以胜任的。
#include #include int mknod(const char *pathname, mode_t mode, dev_t dev); int mkfifo( const char *pathname, mode_t mode );
函数mknod参数中pathname为创建有名管道的全路径名,mode为创建有名管道的模式,指明其存取权限;dev为设备值,该值取决于文件创建的种类,它只在创建设备文件是才会用到。这两个函数调用成功都返回0,否则返回-1. #include ssize_t read (int fd , void * buf , size_t nbytes) ssize_t write (int fd , void * buf , size_t nbytes) 接下来给大家演示一下通过有名管道通信的聊天程序。。。 点击(此处)折叠或打开 // 李四.c
#include
#include
#include
#include
#include
#include
#include
#include
#define FIFO_READ "writefifo" //另外一个程序只要把本程序 #define FIFO_WRITE "readfifo" //拷贝一份然后调换这两个宏即可
#define BUF_SIZE 1024 int left = 0; void *read_buf() { int rfd = -1; char buf[BUF_SIZE] = { '\0' }; int i;
printf("等待对方……\n"); while ((rfd = open(FIFO_READ, O_RDONLY)) == -1) { sleep(1); } while (left != 1) { //printf("i=%d ",i++); int len = read(rfd, buf, BUF_SIZE); if (len > 0) { buf[len] = '\0';
if(strcmp(buf,"不理你了") == 0){ printf("\n对方已经走开!\n"); left = 1; break; // exit(0); } for(i = 0; i < strlen("我:"); i++) printf("\b");
printf("对方:%s\n", buf); printf("我:"); fflush(stdout); } }
close(rfd); return NULL; }
void *write_to() { int wfd; char buf[BUF_SIZE]; int len;
umask(0); if (mkfifo(FIFO_WRITE, S_IFIFO | 0666)) { printf("Can't create FIFO %s because %s", FIFO_WRITE, strerror(errno)); exit(1); } umask(0); wfd = open(FIFO_WRITE, O_WRONLY); if (wfd == -1) { printf("open FIFO %s error: %s", FIFO_WRITE, strerror(errno)); exit(1); } while (left != 1) { printf("我: "); fgets(buf, BUF_SIZE, stdin); buf[strlen(buf) - 1] = '\0'; if (strcmp(buf, "不理你了") == 0 || left == 1) { write(wfd, buf, strlen(buf));//通知对方 close(wfd); unlink(FIFO_WRITE); exit(0); } write(wfd, buf, strlen(buf)); fflush(stdin); } } int main(int argc, char *argv[]) { pthread_t thIDr, thIDw;
pthread_create(&thIDr, NULL,(void *)read_buf, NULL); pthread_create(&thIDw, NULL,(void *)write_to, NULL); pthread_join(thIDr, NULL); pthread_join(thIDw, NULL);
return 0; } 学以置用,呵呵,效果如下:
|