【发布时间】:2011-07-11 08:35:17
【问题描述】:
我正在尝试在 POSIX 系统中使用管道发送整数,但 write() 函数正在发送字符串或字符数据。有没有办法用管道发送整数?
问候
【问题讨论】:
我正在尝试在 POSIX 系统中使用管道发送整数,但 write() 函数正在发送字符串或字符数据。有没有办法用管道发送整数?
问候
【问题讨论】:
以下一个适用于写入管道和从管道读取:
stop_daemon =123;
res = write(cli_pipe_fd_wr, &stop_daemon, sizeof(stop_daemon));
....
res = read(pipe_fd_rd, buffer, sizeof(int));
memcpy(&stop_daemon,buffer,sizeof(int));
printf("CLI process read from res:%d status:%d\n", res, stop_daemon);
输出:
CLI process read from res:4 status:123
【讨论】:
Aschhelpler 的回答是正确的,但如果这可以在以后发展,我建议您使用某种简单的协议库,例如 Google 的 Protocol Buffers,或者只是带有一些基本架构的 JSON 或 XML。
【讨论】:
要么发送一个包含整数的 ASCII 表示的字符串,例如 12345679,要么发送包含 int 的二进制表示的四个字节,例如,0x00、0xbc、0x61、0x4f。
在第一种情况下,您将使用诸如atoi() 之类的函数来取回整数。
【讨论】:
安全的方法是使用snprintf 和strtol。
但是,如果您知道两个进程是使用相同版本的编译器创建的(例如,它们是 forked 的同一个可执行文件),您可以利用 C 中的任何内容都可以读取或写入这一事实作为char的数组:
int n = something();
write(pipe_w, &n, sizeof(n));
int n;
read(pipe_r, &n, sizeof(n));
【讨论】:
(short*)(char*) &n 在取消引用时会违反严格的别名。但是short first_two_bytes; memcpy(&first_two_bytes, &n, sizeof(first_two_bytes)); 并没有违反严格的别名。
n 的值可能不会改变。
write 和read 这样处理void* 中数据的函数通常必须将指针转换为char* 或unsigned char*。 (酌情插入“或const ...”。)但出于这个原因,char 和unsigned char 左值被禁止进行严格混叠优化。