2009-10-13 14 views

उत्तर

13

मैं एक साधारण उदाहरण लिखा था कि कैसे एक स्मृति क्षेत्र को filedescriptor बनाने के लिए:

#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 

char buff[]="qwer\nasdf\n"; 

int main(){ 
    int p[2]; pipe(p); 

    if(!fork()){ 
    for(int buffsize=strlen(buff), len=0; buffsize>len;) 
     len+=write(p[1], buff+len, buffsize-len); 
    return 0; 
    } 

    close(p[1]); 
    FILE *f = fdopen(p[0], "r"); 
    char buff[100]; 
    while(fgets(buff,100,f)){ 
    printf("from child: '%s'\n", buff); 
    } 
    puts(""); 
} 
+0

अच्छा। मामूली वृद्धि के रूप में, आप ['fcntl (fd, F_SETPIPE_SZ, ...)'] का उपयोग कर सकते हैं (http://www.kernel.org/doc/man-pages/online/pages/man2/fcntl.2.html) पाइप बफर आकार बढ़ाने के लिए। इसके लिए [msandiford] क्रेडिट (http://stackoverflow.com/a/14129599/781723) इसके लिए। –

+0

लिनक्स पर, ['vmsplice()'] (http://man7.org/linux/man-pages/man2/vmsplice.2.html) उपयोगी हो सकता है: यह डेटा लिखने के लिए फॉर-लूप की आवश्यकता से बचाता है पाइप के लिए। –

+0

यह एक बहुत ही बढ़िया समाधान है, लेकिन यदि आपको एफडी (यानी तलाश) से पढ़ने से अधिक करने में सक्षम होना चाहिए, तो यह काम नहीं करेगा। आप एक पाइप (कम से कम प्लेटफ़ॉर्म पर उपयोग नहीं करते) पर नहीं खोज सकते हैं। –

0

से प्राप्त एक प्रश्न है। सी ++ के विपरीत, फ़ाइल I/O का सी मॉडल एक्सटेंशन के लिए खुला नहीं है।

+1

fmemopen बफर से फ़ाइल * लौट सकते हैं, लेकिन fileno (fmemopen (...)) लौट -1। मुझे एक और विचार मिला: file_pipes [1] पर पाइप और फीड बफर सामग्री को लिखने()] द्वारा लिखें, और हम file_pipes [0] को उस बफर के फ़ाइल डिस्क्रिप्टर के रूप में देख सकते हैं। लेकिन जब मैं इसका अभ्यास करता हूं, तो लिखना() फ़ंक्शन बस अवरुद्ध होता है। क्या पाइप का कर्नेल बफर पर्याप्त नहीं है? धन्यवाद – solotim

+0

यह पॉज़िक्स, आईआईआरसी है। सी नहीं, इस तरह आपने अपना प्रश्न टैग किया है। अर्थात। यह विंडोज पर काम नहीं करेगा। – MSalters

संबंधित मुद्दे