gpt4 book ai didi

c - 通过命名管道发送结构化数据 (Linux)

转载 作者:太空狗 更新时间:2023-10-29 12:07:47 24 4
gpt4 key购买 nike

我在 Debian 系统上为 IPC 使用命名管道。我会将一些数据作为一组字符串从 bash 脚本发送到用 C 代码编写的后台运行进程。

我要发送的数据是四个字符串,例如accountid、firstname、surname、description。目前,我将数据作为 char 数组从我的 bash 脚本中以空格分隔发送。

echo "accountid firstname surname description" >$pipe

在后台进程中,我将这样的管道数据读取到字符数组“datain”中

res = read(pipe_fd, datain, BUFFER_SIZE);

然后我只是遍历数组寻找空格

例如

char* p = datain;

char accountid[80];
char firstname[80];

// extract the accountid
while(p!='')
{
accountid = p;
++p;
}

++p;

while(p!='')
{
firstname = p;
++p;
}

等....

这种方法看起来有点粗糙,但是我的编程技能不是很好,所以我想知道在 Linux 中是否有更好的策略通过命名管道传输这组数据。

谢谢

最佳答案

  • 管道(命名或未命名)是字节流。如果您在双方都使用相同的语言,则可能有更好的方式来发送结构化数据。在您的情况下,手动编码和解码(就像您正在做的那样)是迄今为止最简单的解决方案。

  • 不要使用空格来分隔可能包含空格的字段,例如人名。使用:,如/etc/passwd

  • 在 C 中,read 很难使用,因为您必须提前决定缓冲区大小并且您必须在循环中调用它,因为它可能会一时兴起返回小于缓冲区大小。 stdio.h 中的函数(对 FILE* 而不是文件描述符进行操作)更易于使用,但仍需要处理长行。如果您不关心 Linux 之外的可移植性,请使用 getline:

    FILE *pipe = fdopen(fd, "r");
    char *line = NULL;
    size_t line_length;
    getline(&line, &line_length, pipe);

然后使用strchr 定位行中的:。 (不要试图使用 strtok,它只适用于不能为空的以空格分隔的字段。)

关于c - 通过命名管道发送结构化数据 (Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3457487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com