फोर्क और पाइप के साथ सी में कंसोल कमांड निष्पादित नहीं कर सकता

मैं सी पर प्रोग्राम बनाने की कोशिश कर रहा हूं, जो कंसोल खोल कमांड निष्पादित करता है

बिल्ली log.txt | अजीब '{प्रिंट $ 7}' | हेड -10

लेकिन तीसरा आदेश 2 उपस्थिति के साथ काम नहीं करेगा।  मैंने जो किया है वह यहां है

#include 
#include 
#include 
#include 

int main() 
{
    int fd[2], status;

    pipe(fd);
    pid_t pid1 = fork();

    if (!pid1) 
    { 
        dup2(fd[1], 1);
        close(fd[0]);
        close(fd[1]);
        char* command[3] = {"/bin/cat", "log.txt", 0}; 
        execvp(command[0], command);
        exit(EXIT_FAILURE);
    } 
    else if (pid1 == -1) 
    {
        fprintf(stderr, "Can't fork, exiting...\n");
        exit(EXIT_FAILURE);
    }

    pid_t pid2 = fork();

    if (!pid2) {
            dup2(fd[0], 0);
            close(fd[0]);
            close(fd[1]);

            char* command[3] = {"awk", "{ print $7 }", 0}; 
            execvp(command[0], command);

            exit(EXIT_FAILURE);
    } else if (pid2 == -1) {
            fprintf(stderr, "Can't fork, exiting...\n"); 
            exit(EXIT_FAILURE);
    }

    pid_t pid3 = fork();

    if (!pid3) {
            dup2(fd[0], 0);
            close(fd[0]);
            close(fd[1]);

            char* command[3] = {"head", "-10", 0}; 
            execvp(command[0], command);

            exit(EXIT_FAILURE);
    } else if (pid3 == -1) {
            fprintf(stderr, "Can't fork, exiting...\n"); 
            exit(EXIT_FAILURE);   
    }

    close(fd[0]);
    close(fd[1]);

    waitpid(pid1, NULL, 0);
    waitpid(pid2, NULL, 0);
    waitpid(pid3, &status, 0);

    exit(status);

    return 0;
}

pid3 निष्पादित नहीं कर सकता है। मैंने pid3 में dup2 (fd [1], 1) बनाने की कोशिश की, लेकिन यह काम नहीं करता है। यह काम करने के लिए pid3 पर और डुप् 2 का उपयोग करके 3 से अधिक कमांड कैसे बनाना चाहिए?

1
cat का बेकार उपयोग खोना एक कामकाज जैसा प्रतीत होता है (-:
जोड़ा लेखक tripleee, स्रोत
आपका अपेक्षित परिणाम क्या है? आप क्या देखते हैं
जोड़ा लेखक HAL, स्रोत

2 उत्तर

आपने एक पाइप बनाया है एक पाइप में दो सिरों होते हैं। दो सिरों के लिए दो सिरों पर्याप्त हैं। यदि आपके पास एक ही पाइपलाइन में तीन प्रक्रियाएं हैं, तो आपको दो पाइप की आवश्यकता है। मध्य में प्रक्रिया दो पाइपों पर होती है और शेष सिरों पर दो अन्य प्रक्रियाएं होती हैं।

इस तस्वीर को देखो:

 cat | awk | head

दो पाइप प्रतीकों को देखें? वे दो पाइप हैं जिन्हें आपको चाहिए।

0
जोड़ा

आपको दो पाइप सेट करना होगा - एक cat को awk से जोड़ने के लिए और awk से head

साथ ही, फ़ाइल डिस्क्रिप्टर को बंद न करें जिन्हें आपको वास्तव में आवश्यकता है (जैसे fd [0] अपने पहले कांटा में!)

0
जोड़ा