1.要求实现AB进程对话a.A进程先发送一句话给B进程,B进程接收后打印b.B进程再回复一句话给A进程,A进程接收后打印c.重复1.2步骤,当收到quit后,要结束AB进程d.提示:两根管道

A进程

#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, const char *argv[])
{
    umask(0);

    //创建有名管道
    if(mkfifo("./myfifo", 0664) < 0)                                      
    {   
        //文件已经存在的错误是一个合法的错误,需要排除,代码允许正常运行
        if(17 != errno)     //EEXIST != errno
        {
            perror("mkfifo");
            return -1; 
        }
    }   
    printf("myfifo create success\n");

	//创建有名管道
    if(mkfifo("./fifo", 0664) < 0)                                      
    {   
        //文件已经存在的错误是一个合法的错误,需要排除,代码允许正常运行
        if(17 != errno)     //EEXIST != errno
        {
            perror("fifo");
            return -1; 
        }
    }   
    printf("myfifo create success\n");
    //以只写的方式打开有名管道, 阻塞
    int fd = open("./myfifo", O_WRONLY);
    if(fd < 0)
    {   
        perror("open");
        return -1; 
    }   
    printf("open fifo success wronly  fd=%d\n", fd);
	//以只读的方式打开有名管道,阻塞
	int fd1 = open("./fifo", O_RDONLY);
    if(fd < 0)
    {
        perror("open");
        return -1;
    }
    printf("open fifo success rdonly  fd=%d\n", fd1);
    char buf[128] = "";
	ssize_t res = 0;
    while(1)
    {   
        printf("请输入>>>");
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf)-1] = 0;

        if(write(fd, buf, sizeof(buf)) < 0)
        {
            perror("write");
            return -1; 
        }
        if(strcmp(buf, "quit") == 0)   
            break;

        bzero(buf, sizeof(buf));
        res = read(fd1, buf, sizeof(buf));
        if(res < 0)
        {
            perror("read");
            return -1;
        }
        else if(0 == res)
        {
            printf("写端退出\n");
            break;
        }
        printf("B: buf=%s\n", buf);

        if(strcmp(buf, "quit") == 0)   
            break;
    }   

    close(fd);
	close(fd1);
    return 0;
}

B进程

#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, const char *argv[])
{                                                                                            
    umask(0);

    //创建有名管道
    if(mkfifo("./myfifo", 0664) < 0)
    {
        //文件已经存在的错误是一个合法的错误,需要排除,代码允许正常运行
        if(17 != errno)     //EEXIST != errno
        {
            perror("mkfifo");
            return -1;
        }
    }
    printf("myfifo create success\n");

    //以只读的方式打开有名管道, 阻塞
    int fd = open("./myfifo", O_RDONLY);
    if(fd < 0)
    {
        perror("open");
        return -1;
    }
    printf("open fifo success rdonly  fd=%d\n", fd);

	//以只写的方式打开有名管道, 阻塞
    int fd1 = open("./fifo", O_WRONLY);
    if(fd1 < 0)
    {
        perror("open");
        return -1;
    }
    printf("open fifo success wronly  fd=%d\n", fd);
    char buf[128] = "";
    ssize_t res = 0;
    while(1)
    {
        bzero(buf, sizeof(buf));
        res = read(fd, buf, sizeof(buf));
        if(res < 0)
        {
            perror("read");
            return -1;
        }
        else if(0 == res)
        {
            printf("写端退出\n");
            break;
        }
        printf("A: buf=%s\n", buf);
        if(strcmp(buf, "quit") == 0)
            break;
		bzero(buf,sizeof(buf));
		printf("请输入>>>");
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf)-1] = 0;

        if(write(fd1, buf, sizeof(buf)) < 0)
        {
            perror("write");
            return -1;
        }
        if(strcmp(buf, "quit") == 0)
            break;
    }

    close(fd);
	close(fd1);
    return 0;
}

结果为:

1.要求实现AB进程对话a.A进程先发送一句话给B进程,B进程接收后打印b.B进程再回复一句话给A进程,A进程接收后打印c.重复1.2步骤,当收到quit后,要结束AB进程d.提示:两根管道_第1张图片

 

你可能感兴趣的:(转世重生,c语言,c++,算法)