我在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中的命名管道上传输这组数据。
由于
答案 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和几乎任何其他语言的库使用。