如何在两个进程之间用管道发送整数!

问题描述:

我想在POSIX系统中用管道发送一个整数,但write()函数正在发送字符串或字符数据。有没有办法用管道发送整数?如何在两个进程之间用管道发送整数!

问候

的安全的方法是使用snprintfstrtol

但是,如果您知道这两个进程是使用相同版本的编译器创建的(例如,它们是与编译版本相同的可执行文件),则可以利用C中的任何内容都可以读取或写入的char数组:

int n = something(); 
write(pipe_w, &n, sizeof(n)); 

int n; 
read(pipe_r, &n, sizeof(n)); 
+0

每个指针可以浇铸为*字符。但我不确定相反是否正确,而不违反严格的别名规则? – 2011-03-08 19:14:24

+1

@cebewee:不确定你的问题到底是什么。 '(short *)(char *)&n'将在解除引用时违反严格的别名。但'short first_two_bytes; memcpy(&first_two_bytes,&n,sizeof(first_two_bytes));'不违反严格的别名。 – aschepler 2011-03-08 19:20:53

+1

@cebewee - 它不是char *,它是void *。每个指针都可以是一个void *。虽然你可能还是对的。这可能会违反严格的别名规则,第二种情况下'n'的值可能不会改变。 – Omnifarious 2011-03-08 19:21:33

要么发送包含的整数例如,12345679 ASCII表示的字符串,或发送包含INT的二进制表示,例如,0x000xbc0x610x4f四个字节。

在第一种情况下,您将使用诸如atoi()之类的函数来取回整数。

Aschelpler的答案是对的,但如果这种情况稍后会增长,我建议您使用Google的Protocol Buffers之类的简单协议库,或者仅使用JSON或带有一些基本模式的XML。

下面一个用于写入管道,并从管道读取为正常工作:

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