2011-03-08 11 views
10

मैं एक POSIX सिस्टम में पाइप के साथ एक पूर्णांक भेजने की कोशिश कर रहा हूं लेकिन write() फ़ंक्शन स्ट्रिंग या वर्ण डेटा भेजने के लिए काम कर रहा है। क्या पाइप के साथ पूर्णांक भेजने का कोई तरीका है?दो प्रक्रियाओं के बीच पाइप के साथ पूर्णांक कैसे भेजें!

सादर

उत्तर

21

सुरक्षित तरीका snprintf और strtol उपयोग करने के लिए है।

लेकिन यदि आप जानते हैं कि दोनों प्रक्रियाएं संकलक के समान संस्करण का उपयोग करके बनाई गई थीं (उदाहरण के लिए, वे एक ही निष्पादन योग्य हैं जो fork एड) हैं, तो आप इस तथ्य का लाभ उठा सकते हैं कि सी में कुछ भी पढ़ा या लिखा जा सकता है char की एक सरणी:

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

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

हर सूचक एक * चार करने के लिए casted जा सकता है। लेकिन मुझे यकीन नहीं है कि सख्त एलियासिंग नियमों का उल्लंघन किये बिना विपरीत सही है? –

+1

@cebewee: सुनिश्चित नहीं है कि आपका प्रश्न क्या है। '(लघु *) (char *) और n' संदर्भित होने पर सख्त एलियासिंग का उल्लंघन करेगा। लेकिन 'पहले first_two_bytes; memcpy (& first_two_bytes, & n, sizeof (first_two_bytes)); 'सख्त एलियासिंग का उल्लंघन नहीं करता है। – aschepler

+1

@cebewee - यह char * नहीं है, यह शून्य है *। और हर सूचक एक शून्य * हो सकता है। हालांकि आप अभी भी सही हो सकते हैं। यह सख्त एलियासिंग नियमों का उल्लंघन कर सकता है और दूसरे मामले में 'n' का मान नहीं बदला जा सकता है। – Omnifarious

1

या तो एक स्ट्रिंग पूर्णांक जैसे, 12345679 की ASCII प्रतिनिधित्व युक्त भेज सकते हैं या int की द्विआधारी प्रतिनिधित्व, जैसे, 0x00, 0xbc, 0x61, 0x4f युक्त चार बाइट्स भेजें।

पहले मामले में, आप पूर्णांक प्राप्त करने के लिए atoi() जैसे फ़ंक्शन का उपयोग करेंगे।

0

एशेलप्लर का जवाब सही है, लेकिन अगर ऐसा कुछ है जो बाद में बढ़ सकता है तो मैं आपको कुछ बुनियादी स्कीमा के साथ 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 
संबंधित मुद्दे