خط أنابيب المشاكل ثلاثة أوامر "dmesg | sort | more" c ++

StackOverflow https://stackoverflow.com/questions/3929179

  •  30-09-2019
  •  | 
  •  

سؤال

لقد نجحت في تنشيط إخراج أمر في إدخال آخر ثم أظهر إخراج الأمر الثاني على الشاشة.

أريد أن أفعل هذا مع ثلاثة أوامر متتالية. (في الواقع أريد أن أفعل ذلك مع أوامر N التي تم نقلها إلى البرنامج في وقت التشغيل.

هذه هي محاولتي في خطوط الأنابيب ثلاثة أوامر معًا.

تم تحديثه: قمت بتحديث سؤالي ليعكس آخر محاولتي.

    #include <string.h>
    #include <fstream>
    #include <iostream>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    using namespace std;

    int main(int argc, char * argv[])
    {
             pid_t pid;
        int pfd[2];
        char* prgname = NULL;
        if(pipe(pfd) == -1)
        {
                perror("error on pipe call");
                return(1);
        }
        for(int j = 0;j<numberOfCommands;j++)
        {
                cout<<commands[j]<<"_"<<endl;
        }
        pid = fork();
        if(pid == 0){//child process
                close(pfd[0]); //close read end of pipe
                dup2(pfd[1],1);//connect the pipes
                close(pfd[1]);//close extra file descriptors
                prgname = (char*)"dmesg"; //commands[0];//first command
                execlp(prgname, prgname, 0);//Load the program
        }
        else
        {
                int pfd2[2];
                if(pipe(pfd2) == -1)
                {
                        perror("error on pipe call 2");
                        return(1);
                }
                pid = fork();
                if(pid == 0)//child
                {
                        close(pfd[1]);
                        dup2(pfd[0],0);
                        close(pfd[0]);
                        close(pfd2[0]);
                        dup2(pfd2[1],1);
                        close(pfd2[1]);
                        prgname = (char*)"sort";
                        execlp(prgname,prgname,0);
                }
                else
                {
                close(pfd2[1]); //close the write end of the pipe
                dup2(pfd2[0],0);//connect the pipes
                close(pfd2[0]); //close extra file descriptor
                prgname = (char*)"more"; //commands[1];//now run the second command
                execlp(prgname, prgname, 0);//Load the program
                }
        }
        return 0;
}

لقد قمت بترميز جميع القيم من أجل البساطة. يعرض البرنامج ما ينبغي أن يكون إخراج "DMESG | المزيد" ولكن لا يفعل جزء الفرز ثم يتجمد. أرى تسول DMESG وأكثر في أسفل اليسار ولكن لا يمكنني عرض المزيد.

أيه أفكار؟

هل كانت مفيدة؟

المحلول

pipe(2) يوفر فقط 2 واصفات الملف لأنبوب واحد. واصف الملف الثالث (pfd[2]) غير مرغوب فيه ولا يتم تهيئته أبدًا. إذا كنت ترغب في إنشاء خط أنابيب مع 3 أوامر فيه ، فأنت بحاجة إلى الاتصال pipe() مرتين للحصول على أنبوبين: واحد لتوصيل العمليات الأولى والثانية ، والآخر لتوصيل العمليات الثانية والثالثة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top