我在 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/