2013-02-09 51 views
5

मैं इस कोड के साथ कुछ समस्या प्रयोग कर रहा हूँ:पाइप कॉल और तुल्यकालन

#include <stdio.h> 
#include <stdlib.h> 

#define SIZE 30 
#define Error_(x) { perror(x); exit(1); } 
int main(int argc, char *argv[]) { 

    char message[SIZE]; 
    int pid, status, ret, fd[2]; 

    ret = pipe(fd); 
    if(ret == -1) Error_("Pipe creation"); 

    if((pid = fork()) == -1) Error_("Fork error"); 

    if(pid == 0){ //child process: reader (child wants to receive data from the parent) 
     close(fd[1]); //reader closes unused ch. 
     while(read(fd[0], message, SIZE) > 0) 
       printf("Message: %s", message); 
     close(fd[0]); 
    } 
    else{//parent: writer (reads from STDIN, sends data to the child) 
     close(fd[0]); 
     puts("Tipe some text ('quit to exit')"); 
     do{ 
      fgets(message, SIZE, stdin); 
      write(fd[1], message, SIZE); 
     }while(strcmp(message, "quit\n") != 0); 
     close(fd[1]); 
     wait(&status); 
    } 
} 

कोड ठीक काम करता है, लेकिन मैं क्यों की व्याख्या नहीं कर सकते हैं! माता-पिता और बाल प्रक्रियाओं के बीच कोई स्पष्ट सिंक नहीं है। यदि बच्चे-प्रक्रिया माता-पिता के सामने निष्पादित होती है, तो पढ़ना चाहिए 0 को वापस करना होगा और प्रक्रिया समाप्त होती है, लेकिन किसी कारण से यह माता-पिता निष्पादन की प्रतीक्षा करता है। यह आपके द्वारा कैसे समझाया जाता है? शायद मुझे कुछ याद आ रही है।

(संपादित)

+2

आप 0 को वापस पढ़ने की उम्मीद क्यों करते हैं? आप कहीं भी गैर-अवरुद्ध I/O सेट नहीं कर रहे हैं। – Mat

+1

... और यह गैर-अवरुद्ध I/O के लिए भी 0 नहीं होगा। –

+0

प्रक्रिया के लिए 'पढ़ा' अवरुद्ध है? –

उत्तर

5

जब से तुम pipe2 में O_NONBLOCK उपयोग नहीं किया, read डिफ़ॉल्ट रूप से रोक रहा है। इसलिए यह तब तक प्रतीक्षा करता है जब तक कि पाइप में डेटा लिखा न जाए।

+0

जब' (एफडी [0], संदेश, SIZE)> 0' स्थिति में गलत है? –

+0

जब यह दूसरी तरफ पाइप बंद हो जाता है तो यह गलत हो जाता है; अगर आपने अभी तक कुछ नहीं लिखा है, तो पाठक मानता है कि आप बाद में कुछ लिखना चाहेंगे। IOW पाइप एक अंतर्निहित सिंक के रूप में कार्य करता है। – loreb

+2

पाइप बिल्कुल अंतर्निहित नहीं है। यह एक बहुत ही स्पष्ट सिंक्रनाइज़ेशन तंत्र है। शायद सबसे आम है। शायद सबसे सरल भी। –