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

标签 c linux named-pipes

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

我要发送的数据是四个字符串,例如 accountid、名字、姓氏、描述。目前,我将数据作为 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/

相关文章:

python - Python 可以从 Windows Powershell 命名管道中读取数据吗?

.net - 双向命名管道问题

将 ASCII 字符串转换为 Unicode? Windows,纯 C

c - 不懂信号

c - 没有这样的文件或目录打开系统调用错误

linux - 如果接下来的 X 行不包含特定字符串,则使用 grep

Linux脚本-用户真实姓名

C++ -fvisibility=hidden -fvisibility-inlines-hidden

c - 用 C 语言对数组进行冒泡排序

java - java中如何判断文件是否为命名管道