2011-03-08 53 views

回答

21

的安全的方法是使用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

1

要麼發送包含的整數例如,12345679 ASCII表示的字符串,或發送包含INT的二進制表示,例如,0x000xbc0x610x4f四個字節。

在第一種情況下,您將使用諸如atoi()之類的函數來取回整數。

0

Aschelpler的答案是對的,但如果這種情況稍後會增長,我建議您使用Google的Protocol Buffers之類的簡單協議庫,或者僅使用JSON或帶有一些基本模式的XML。

-2

下面一個用於寫入管道,並從管道讀取爲正常工作:

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 
相關問題