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

时间:2010-08-11 10:46:45

标签: c linux named-pipes

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

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

echo "accountid firstname surname description" >$pipe

在后台进程中,我将这样的管道数据读入char数组'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中的命名管道上传输这组数据。

由于

2 个答案:

答案 0 :(得分:2)

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

  • 不要使用空格来分隔可能包含空格的字段,例如人名。使用:,例如/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,它只适用于不能为空的空格分隔的字段。)

答案 1 :(得分:1)

从2010年开始,您可能希望使用JSON或XML对数据进行编码,这两种数据都可以作为C和几乎任何其他语言的库使用。