pipe(7) कहते हैं:

यदि कोई प्रक्रिया एक खाली पाइप से पढ़ने का प्रयास करती है, तो डेटा उपलब्ध होने तक पढ़ें (2) अवरुद्ध हो जाएगा। यदि कोई प्रक्रिया एक पूर्ण पाइप (नीचे देखें) को लिखने का प्रयास करती है, तो लिखें (2) तब तक ब्लॉक करें जब तक कि लिखने को पूरा करने की अनुमति देने के लिए पाइप से पर्याप्त डेटा नहीं पढ़ा गया हो। O_NONBLOCK ओपन फाइल स्टेटस फ्लैग को सक्षम करने के लिए fcntl(2) F_SETFL ऑपरेशन का उपयोग करके I/O को नॉनब्लॉक करना संभव है।

नीचे मेरे पास जीसीसी के साथ लिनक्स पर संकलित दो सरल सी प्रोग्राम हैं:

reader.c:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define STACKBUF_SIZE 128
#define FIFO_PATH "/home/bogdan/.imagedata"

signed int main(int argc, char **argv) {
    int fifo_fd = open(FIFO_PATH, O_RDONLY); // blocking... - notice no O_NONBLOCK flag
    if (fifo_fd != -1) {
        fprintf(stdout, "open() call succeeded\n");
    }

    while (1) {
        char buf[STACKBUF_SIZE] = {0};
        ssize_t bread = read(fifo_fd, buf, STACKBUF_SIZE);
        fprintf(stdout, "%d - %s\n", bread, buf);
        sleep(1);
    }

    close(fifo_fd);

    return EXIT_SUCCESS;
}

writer.c:

#define STACKBUF_SIZE 128
#define FIFO_PATH "/home/bogdan/.imagedata"
#define DATA "data"

int main(void) {
    int fifo_fd = open(FIFO_PATH, O_WRONLY); // blocks until reader opens on the reader end, however we always first open the reader so...
    if(fifo_fd != -1) {
        ssize_t bwritten = write(fifo_fd, DATA, 5);
        fprintf(stdout, "writer wrote %ld bytes\n", bwritten);
    }
    
    close(fifo_fd);
    return EXIT_SUCCESS;
}

फ़ाइलों को gcc writer.c -Og -g -o ./writer के साथ दो अलग-अलग बायनेरिज़ में संकलित किया गया है, जो पाठक के लिए समान है।

खोल से मैं पहले पाठक बाइनरी निष्पादित करता हूं, और जैसा कि अपेक्षित था, प्रारंभिक open() कॉल ब्लॉक जब तक मैं लेखक को निष्पादित नहीं करता। मैं फिर लेखक को निष्पादित करता हूं, जिसकी open() कॉल तुरंत सफल हो जाती है और यह फीफो को 5 बाइट्स लिखता है (जो पाठक द्वारा सही ढंग से प्रदर्शित होते हैं), जिसके बाद यह एफडी को बंद कर देता है, फीफो को खाली छोड़ देता है (?)

हालांकि, निम्न read() पाठक के लूप लूप में कॉल बिल्कुल भी ब्लॉक नहीं होते हैं, और इसके बजाय केवल 0 वापस आते हैं

जब तक मुझे कुछ याद नहीं आ रहा है (मैं शायद हूं) यह पाइप (7) मैनपेज द्वारा उल्लिखित अर्थशास्त्र के साथ संघर्ष में है, क्योंकि फीफो एफडी पाठक और लेखक दोनों में O_NONBLOCK ध्वज के बिना खुला था।

1
bool3max 26 नवम्बर 2020, 18:06

1 उत्तर

सबसे बढ़िया उत्तर

आपके द्वारा उद्धृत मैनुअल का अनुभाग केवल खुले लेखकों वाले पाइपों पर लागू होता है। दो पैराग्राफ नीचे, यह कहता है:

यदि किसी पाइप के राइट एंड को संदर्भित करने वाले सभी फाइल डिस्क्रिप्टर बंद कर दिए गए हैं, तो पाइप से पढ़ने का प्रयास (2) को एंड-ऑफ-फाइल दिखाई देगा (पढ़ें (2) वापस आ जाएगा)।

1
Joseph Sible-Reinstate Monica 26 नवम्बर 2020, 18:15