写入/读取 FIFO 文件 - linux

2023-12-20

我一直在尝试了解 FIFO,并提出了一个简单的服务器和客户端程序。
我不想做任何花哨的事情,只是让一个进程扮演“服务器”的角色,这个进程将“监听”另一个进程传递的任何消息;客户端。
这是我写的:

server.c

#include<stdio.h>
#include <fcntl.h>
#include <stdlib.h>


#define INGOING "clientToServer.fifo"

#define BUFFER 200

int main(int argc, char *argv[]) {

    char in[BUFFER];

    mkfifo(INGOING, 0666);

    printf("Welcome to server.\n");
    printf("channel for sending messages to server is %s\n", INGOING);

    int in_fd=open(INGOING, O_RDONLY);

    if (in_fd==-1) {
        perror("open error");
        exit(-1);
    }

    while (read(in_fd, in, BUFFER)>0) {
        printf("You sent %s to server.\n", in);
    }

    return 2;
}

正如你所看到的,当我在后台运行它时,这非常简单./server.out&它被阻止在read打电话并等待有人写信clientToServer.fifo。到目前为止,一切都很好。

现在,考虑客户端:
client.c

#include<stdio.h>
#include<fcntl.h>
#include<string.h>


#define BUFFER 200

int main(int argc, char *argv[]) {

    char input[BUFFER]={0};
    int out_fd=open("clientToServer.fifo", O_WRONLY);

    if (out_fd==-1) {
        perror("open error");
    }

    while (1) {

        printf("What would you like to send to server? (send Quit to quit)\n");
        fgets(input, BUFFER, stdin);
        if (input[strlen(input)-1]=='\n') {
            input[strlen(input)-1]='\0';
        }

        if (strcmp(input, "Quit")==0) {
            printf("Bye!");
            break;
        }

        if (write(out_fd, input, strlen(input))==-1) {
            perror("write error");
        }
    }

    return 1;
}

这是客户。代码也很简单。当我运行它时./a.out从 shell 中,它可以工作 - 它发送消息,并且server.out工艺印刷品You sent %s to server.
问题是,当我发送Quit通过客户端到服务器,虽然a.out进程根据需要终止,while循环中server.out也休息。意思是,read不再阻止server.out处理并等待其他客户端,相反,服务器程序与客户端一起结束。
为什么会发生这种情况?不应该read暂停server.out again,即使在a.out进程结束?


当我在后台使用 ./server.out& 运行此命令时,它在读取调用处被阻止并等待任何人写入 clientToServer.fifo

实际上它阻塞在open。这就是 FIFO 的工作方式。这open(在阻塞模式下)将阻塞,直到另一端打开 FIFO。

server.out 中的 while 循环也会中断。意思是,读取不再阻塞server.out进程并等待其他客户端,相反,服务器程序结束

再次强调,这是正常行为。只有一个客户端进程连接到 FIFO,因此当它关闭其末端时,会发送 EOF 并且服务器退出。如果多个客户端同时连接到 FIFO,您将不会看到 EOF,直到最后一个客户端关闭它。如果您希望长时间运行的服务器连续为多个客户端提供服务,最简单的方法就是以读/写方式打开服务器的 FIFO。这样,总会有一个读取器/写入器(服务器本身),并且即使最后一个客户端退出,您也不会看到 EOF。当需要关闭服务器时,请关闭服务器中的相应端,并让真正的客户端退出时顺其自然。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

写入/读取 FIFO 文件 - linux 的相关文章

随机推荐

  • 查找图中所有完整的子图

    是否有已知的算法或方法来查找图中的所有完整子图 我有一个无向 未加权的图 我需要找到其中的所有子图 其中子图中的每个节点都连接到子图中的每个其他节点 有现成的算法吗 这被称为派系问题 http en wikipedia org wiki C
  • 为什么在 ASP .Net MVC 应用程序中使用 SignalR 2.x 库时 HTTPContext.Current.Session 为 null?

    我正在尝试将我们的 ASP Net MVC 应用程序从使用 Signal R1 x 迁移到 SignalR 2 x 我刚刚发现了一个问题 这肯定会给我们的前进带来问题 我们的 Web 应用程序基于 MVC 并大量使用 HttpContext
  • Toast:“this”和“getApplicationContext()”之间的区别?

    我的设备运行 Android 5 1 1 我发现如果我使用 Toast makeText this This is a toast Toast LENGTH SHORT show 我懂了 但如果我使用getApplicationContex
  • HTML onchange (this.value)

    我们在代码中发现了这个 我们还没有自己编写它 而且我们是编程新手 任何人都可以解释 this value 的含义以及如何更改它吗
  • 自定义 ListView 项目重复

    我正在尝试将动态文本视图添加到列表视图项 文本视图可以是 1 2 或更多 具体取决于我成功添加文本视图的数据 但问题是文本视图在滚动时重复 我每次都在循环中创建文本视图的新对象 我知道 android 尝试重用现有视图但我每次都必须添加新视
  • Mongodb 更新查询在 azure cosmos db 中的嵌入文档中不起作用

    嵌入式更新查询在 mlab 和 atlas 中工作正常 但在 Cosmos DB 中不起作用 我的收藏结构 id ObjectId 5982f3f97729be2cce108785 password 2y 10 F2P9ITmyKNebpo
  • 将 std::list 转换为 C 友好类型

    最优雅的返回方式是什么std list从共享库函数 由 C 代码实现 到 C 使用者的对象 我知道为了std vector 我们可以返回向量第一个元素的地址 并让使用者将其视为数组 但 std list 是作为链接的 lis 实现的 复制s
  • 如何在 Cython 中输入生成器函数?

    如果我有一个 Python 生成器函数 请说 def gen x for i in range x yield i 2 如何声明输出数据类型是int在赛通 值得吗 Thanks Edit 我在变更日志中读到了关于正在实现的 异步 生成器的提
  • 如何从 Powershell 脚本访问 Outlook 电子邮件正文?

    我的 Outlook 中有一个基本文件夹 其中包含来自监控系统的警报 我想根据该数据创建一个表 为此 我一直尝试在 Outlook 中访问电子邮件的正文内容 Add Type Assembly Microsoft Office Intero
  • 为什么我们在 2021 年需要 webpack [重复]

    这个问题在这里已经有答案了 我试图从 freecodecamp 的这段视频中获取 webpack 在视频开始时 讲师说我们需要 webpack 来管理依赖项 否则我们需要添加
  • 如何加载多对多 LINQ 查询?

    我有以下 非常标准的 表结构 Post lt gt PostTag lt gt Tag 假设我有以下记录 PostID Title 1 Foo 2 Bar 3 Baz TagID Name 1 Foo 2 Bar PostID TagID
  • 集成 ZF/Doctrine2:我将模型/实体和代理类放在哪里

    如果我确实将 Zend Framework 1 10 与 Doctrine 2 集成 我应该将 Doctrine 模型 实体和代理放在哪里 我想到了 application or the library目录 如果我把 library不过 它
  • 如何制作模拟二维网格的邻接矩阵

    基本上只是想知道在 python 中执行此操作的好方法是什么 我之前也在 python 中使用过一种暴力方式完成此操作 但它并不是直观的方法 所以如果有人能帮忙那就太好了 对于逐行网格 邻接矩阵如下所示 在一行内 相邻的数字形成两条平行的对
  • 错误:RPC 失败; curl 55 发送失败:连接被中止

    Enumerating objects 18 done Counting objects 100 18 18 done Delta compression using up to 4 threads Compressing objects
  • Android服务生命周期延续

    在主要活动中 我有广播接收器 待处理意图和警报管理器 它按照选定的时间触发 System currentTimeMillis smstimeinmilliseconds Intent intent new Intent this DBBro
  • 列表中成对的乘积之和

    这就是我遇到的问题 给定一个列表 xList 9 13 10 5 3 我想计算每个元素乘以后续元素的总和 sum 9 13 9 10 9 5 9 3 sum 13 10 13 5 13 3 sum 10 5 10 3 sum 5 3 在这种
  • 为Spring Kafka设置authorizationExceptionRetryInterval

    任何人都知道如何设置新属性 authorizationExceptionRetryInterval 而无需手动创建 ConcurrentKafkaListenerContainerFactory 我本来想说 Component class
  • 无法捕获的异常,第 2 部分

    Update 我已在 Microsoft Connect 上提交了错误报告 https connect microsoft com VisualStudio feedback details 568271 debugger halting
  • 在 XAML 中设置多个枚举标志

    有没有办法在 XAML 中设置多个枚举标志 传统上在代码隐藏中用 分隔 我尝试过类似的事情
  • 写入/读取 FIFO 文件 - linux

    我一直在尝试了解 FIFO 并提出了一个简单的服务器和客户端程序 我不想做任何花哨的事情 只是让一个进程扮演 服务器 的角色 这个进程将 监听 另一个进程传递的任何消息 客户端 这是我写的 server c include