从命名管道读取

2024-05-06

我必须实现一个“打印服务器”。我有 1 个客户端文件和 1 个服务器文件:

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

int get_line( char *dest, int size );

#define MAX 1024

void main ()
{
    char const *pipe = "printservers";
    char buffer[MAX];
    int fd;

    get_line( buffer, MAX );

    if( mkfifo( pipe, 0666 ) < 0 )
    {
        printf( "Cannot create a pipe\n" );
        exit( EXIT_FAILURE );
    }

    fd = open( pipe, O_WRONLY );

    write( fd, buffer, MAX );

    close( fd );

    //unlink( pipe );

}

int get_line( char *dest, int size )
{
    int c, i;
    for( i = 0; i < size - 1 && ( c = getchar() ) != EOF && c != '\n'; ++i )
        dest[i] = c;
    if( c == '\n' )
    {
        dest[i] = c;
        ++i;
    }
    dest[i] = '\0';
    return i;
}

这是客户端,它从标准输入读取一行并写入 命名管道称为打印服务器。这按预期工作。

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

#define MAX_BUF 1024
#define MAX_PID 8

int main()
{
    int fd;
    char * myfifo = "printservers";
    char buf[MAX_BUF];

    /* open, read, and display the message from the FIFO */
    fd = open( myfifo, O_RDONLY );
    while( 1 )
    {
        if( read( fd, buf, MAX_BUF ) > 0 )
            printf("Received: %s\n", buf);
    }
    close(fd);

    return 0;
}

这是从管道读取的服务器。但它不适用于 while 循环。如果我从客户端发送消息,则会打印第一条消息,但会忽略以下消息。 有人可以帮我解决我的问题吗? 谢谢 帕特里克


服务器的 while 循环中存在编码错误 - 即使出现错误或服务器在 FIFO 上接收到 eof,服务器也永远不会退出循环。它应该改为这样:

while(1)
{
    if((bytesread = read( fd, buf, MAX_BUF - 1)) > 0)
    {
        buf[bytesread] = '\0';
        printf("Received: %s\n", buf);
    }
    else
        break;
}

您的另一个问题是您的客户端发送一行然后关闭 FIFO。服务器读取直到 EOF。因此它将读取单行,然后由于客户端关闭而命中 EOF。这是完全正常的。

当您希望服务器为多个客户端提供服务时,就会出现问题。在这种情况下,您不想在每个客户结束阅读后停止阅读。语义是服务器只会在最后一个之后看到 EOFall客户关闭。因此,适应服务器处理多个客户端的一个简单方法是将服务器端 FIFO 打开为读/写。然后总会有一个“写入器”,即服务器本身,打开 FIFO 的写入端。这将阻止服务器看到 EOF,直到您决定将其关闭。

第二个问题是您需要循环读取和写入。你是not保证一次通话即可满足您的完整数据请求。

另外,让客户端创建服务器读取的 FIFO 是一种奇怪的方法。通常,您希望服务器创建客户端连接的已知 FIFO。

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

从命名管道读取 的相关文章

  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • 如何在 Eclipse 中添加视角

    如果我安装了两个版本的 Eclipse 如何将在一个 Eclipse 版本 中安装的透视图添加到另一个版本 首先如何添加视角 即 它们来自哪里 不要告诉我 打开视角 对话框 由于所选答案在 观点从何而来 的细节上有点 差 因此以下是一些精度
  • 已加载 nib 文件但未设置视图出口

    我不小心删除了universityPicker xib 然后用相同的名称创建了一个新的 但无法连接 文件崩溃并给出此消息 reason UIViewController loadViewFromNibNamed bundle loaded
  • 运行时动态转换

    有没有一种方法可以在运行时动态转换 如以下伪代码 foreach DataRow row in table Rows foreach DataColumn col in table Columns if row col DBNull Val
  • 过滤(搜索和替换)InputStream 中的字节数组

    我有一个 InputStream 它将 html 文件作为输入参数 我必须从输入流中获取字节 我有一个字符串 XYZ 我想将此字符串转换为字节格式 并检查从 InputStream 获得的字节序列中是否存在与该字符串匹配的字符串 如果有的话
  • Facebook 爬虫严重攻击我的服务器并忽略指令。多次访问相同资源

    Facebook 爬虫每秒多次访问我的服务器 它似乎忽略了 Expires 标头和 og ttl 属性 在某些情况下 它会在 1 5 分钟内多次访问同一 og image 资源 在一个示例中 爬虫程序在 3 分钟内使用 12 个不同的 IP
  • 时间:2019-03-17 标签:c++rapidjson返回值

    我在我的项目中使用rapidjson 我有一个方法可以解析 json 并返回其中的一部分 static rapidjson Document getStructureInfo std string structureType rapidjs
  • PyCharm 可以列出项目中的所有 Python 错误吗?

    我在虚拟环境中使用 python 2 7 和 PyCharm 2 7 2013 年 2 月 7 日的新版本 每当我打开其中有明确错误的Python文件 相当于其他语言中的编译错误 例如使用未声明的变量 调用不存在的函数 时 它会在文件的装订
  • 从 C++ 中的 std::string 获取字节

    我正在一个 C 非托管项目中工作 我需要知道如何获取像 一些要加密的数据 这样的字符串并获取一个 byte 数组 我将用它作为加密的源 在 C 中我做 for int i 0 i lt text Length i buffer i byte
  • 如何使用php在mysql中显示字幕中的多条新闻

    我在从 mysql 检索数据以在字幕中显示时遇到问题 当我访问网页时 它仅在字幕中显示数据库中的一项数据 我的问题是如何检索所有存储的数据 谢谢 下面是代码部分 select SELECT newsid headlines from new
  • 当前文档字段值内的地理空间 $near

    采取这个查询 location near x y maxDistance this field 我想将当前评估文档中指定字段的值分配给 maxDistance 那可能吗 是的 这是可能的 你只需使用 geoNear https docs m
  • 如何使用 Angular/Ionic/JS 显示 Motion JPEG 二进制数据流?

    我正在为设备编写应用程序 此类设备将收到 POST 请求 并发回multipart x mixed replace二进制数据流 我必须在我的应用程序主页的一部分上显示此类流 我查了一下 这种情况的资源非常有限 到目前为止 我发现如果 Mot
  • Amazon S3 无法通过 Cloudfront 上传文件

    我想通过 Cloudfront 使用签名 URL 将文件上传到 S3 Cloudfront 行为中允许 HTTP PUT 桶策略 Sid 2 Effect Allow Principal AWS arn aws iam cloudfront
  • 从内存中获取Java类字节码(经过多次转换)

    我正在为 Minecraft 开发一个 coremod 并在加载许多类时对其进行转换 然而问题是 有多个 coremod 也转换了与我相同的类 并且我遇到了一些我想研究的奇怪行为 那么问题来了 经过多次转换后的字节码如何检查呢 当我转换它时
  • Azure DevOps/VSTS 始终在干净的存储库上报告“DETACHED HEAD”

    Friends 我现在厌倦了 Azure DevOps VSTS Jenkins 好多了 现在仍然如此 只是我的组织想要使用 Azure DevOps 我有一个谜团需要帮助来解决 以下是我的笔记本电脑上的存储库 它没有未跟踪或未提交的更改
  • 如何使用 Moq 模拟 Web 服务调用?

    The using下面点击了我不想实际点击的外部资源 我想测试someResult以及使用它的代码 但每次我运行单元测试时 该代码仍然尝试访问真正的 Web 服务 如何使用最小起订量来伪造对 Web 服务的真实调用 但不模拟使用中的其余代码
  • matplotlib 轴标签偏移量的因素和变化

    在 matplotlib 中的轴刻度标签上 有两种可能的偏移量 factors and shifts 在右下角 1e 8 是一个 因子 1 441249698e1 是一个 移位 这里有很多答案展示了如何操纵两个都 matplotlib 将轴
  • Android EditText:在触摸时选择所有文本,并在用户开始输入时清除。

    我的应用程序中有一个编辑文本 当用户触摸编辑文本时 应选择整个文本 而当他开始输入文本时 应清除文本 一个例子是浏览器地址栏 有什么办法可以做到这一点吗 请帮助我 您可以使用以下方法选择 EditText 中的所有文本 android se
  • 删除核心数据中的对象

    我的核心数据模型中有一个实体 如下所示 interface Selection NSManagedObject property nonatomic retain NSString book id property nonatomic re
  • 如何BSWAP 64位寄存器的低32位?

    我一直在寻找如何将 BSWAP 用于 64 位寄存器的低 32 位子寄存器的答案 例如 0x0123456789abcdef位于 RAX 寄存器内 我想将其更改为0x01234567efcdab89用一条指令 因为性能 所以我尝试了以下内联
  • 从命名管道读取

    我必须实现一个 打印服务器 我有 1 个客户端文件和 1 个服务器文件 include