2022.9.01 有名管道的特点,有名管道的读写进程阻塞情况,有名管道的创建,实现不同进程间的相互通信的完整代码。

发布于:2023-01-02 ⋅ 阅读:(217) ⋅ 点赞:(0)

有名管道

有名管道的特点:

(1):也是一个半双工的通信模式

(2):可以实现互不相关的两个进程的通信,也可以实现有亲缘关系的两个进程的通信。

(3):该管道可以通过路径名来指出,在文件系统中是可见的。

(4):FIFO严格地遵循先进先出规则,不支持lseek()等文件定位操作。

有名管道的读写进程阻塞情况:

(1):缺省情况下,如果当前FIFO内没有数据,读进程将一直阻塞到有数据写入或是FIFO写端关闭。

(2):只要FIFO有空间,数据可以被写入。若空间不足,写进程会阻塞。

有名管道的创建:

创建函数:mkfifo("./管道文件名“,文件权限)函数,成功:返回0,失败:返回 -1。

打开创建的管道文件名:open("管道文件名",文件权限),成功:返回0,失败:返回-1。

进行读写操作:read(),write();

关闭管道文件:close()函数;

实现不同进程间的相互通信的完整代码。

写进程程序代码:

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

int main()
{
    pid_t pid = fork();
    if(pid < 0)
    {
        perror("fork error!");
        return -1;
    }
    if(pid > 0)
    {
        int ret = mkfifo("./text2.fifo",0666);
        if(ret < 0&&EEXIST != errno)
        {
             perror("mkfifo error!");
            return -1;
        }
        int fd = open("text2.fifo",O_RDWR);
        if(fd < 0)
        {
            perror("open error!");
            return -1;
        }
        else
        {
            char buf[100] = {0};
            while(1)
            {
                memset(buf,0,sizeof(buf));
                printf("fifo_w发消息:\n");
                gets(buf);
                int ret1 = write(fd,buf,sizeof(buf));
                  if(ret1 < 0)
                 {
                    perror("write error!");
                    close(fd);
                    return -1;
                }
            }
         }
        close(fd);
    }
    else
    {
        int ret2 = mkfifo("./text3.fifo",0666);
        if(ret2 < 0 && EEXIST != errno)
        {
            perror("mkfifo1 error!");
            return -1;
        }
        int fd1 = open ("text3.fifo",O_RDWR);
        if(fd1 < 0)
        {
            perror("open1 error!");
            return -1;
        }
        else
        {
            char buf1[100] = {0};
            while(1)
            {
                memset(buf1,0,sizeof(buf1));
                int ret3 = read(fd1,buf1,sizeof(buf1)); 
                if(ret3 < 0)
                {
                    perror("read1 error!");
                    close(fd1);
                }
                else
                {
                    printf("收到fifo_r的信息:%s\n",buf1);
                }
            }
        }
        close(fd1);
    }
    
    return 0;
}

读进程程序代码:


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

int main()
{
    pid_t pid = fork();
    if(pid < 0)
    {
        perror("fork error!");
        return -1;
    }
    if(pid > 0)
    {
        int ret = mkfifo("./text2.fifo",0666);
         if(ret < 0 && EEXIST != errno)
        {
             perror("mkfifo error!");
            return -1;
         }
         int fd = open("text2.fifo",O_RDWR);
         if( fd < 0)
        {
             perror("open error!");
            return -1;
         }
        else
        {
            char buf[100] = {0};
             while(1)
            {
                 memset(buf,0,sizeof(buf));
                int ret1 = read(fd,buf,sizeof(buf));
                if(ret1 < 0)
                {
                    perror("read error!");
                    close(fd);
                    return -1;
                }
                else
                {
                     printf("收到fifo_w信息:%s\n",buf);
                }
              }
         }
        close(fd);
    }
    else
    {
        int ret2 = mkfifo("./text3.fifo",0666);
        if(ret2 < 0&&EEXIST != errno)
        {
             perror("mkfifo1 error!");
            return -1;
        }
        int fd1 = open("text3.fifo",O_RDWR);
        if(fd1 < 0)
        {
            perror("open1 error!");
            return -1;
        }
        else
        {
            char buf1[100] = {0};
            while(1)
            {
                memset(buf1,0,sizeof(buf1));
                printf("fifo_r发消息:\n");
                gets(buf1);
                int ret3 = write(fd1,buf1,sizeof(buf1));
                  if(ret3 < 0)
                 {
                    perror("write1 error!");
                    close(fd1);
                    return -1;
                }
            }
        }
        close(fd1);
    }
    return 0;
}

程序结果:

 


网站公告

今日签到

点亮在社区的每一天
去签到