Board logo

标题: linux管道的那点事(2) [打印本页]

作者: yuyang911220    时间: 2017-1-25 19:36     标题: linux管道的那点事(2)

读写有名管道:
#include
ssize_t read (int fd , void * buf , size_t nbytes)
ssize_t write (int fd , void * buf , size_t nbytes)
接下来给大家演示一下通过有名管道通信的聊天程序。。。
点击(此处)折叠或打开
// 李四.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

#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;
}
学以置用,呵呵,效果如下:




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0