Сантехнические трубы с pipe () в c ++ - PullRequest
0 голосов
/ 10 февраля 2012

В настоящее время я пытаюсь соединить каналы между родителем и его дочерними элементами.Дети исполняют sort и сортируют входные данные, полученные от родителей.Дети потом пишут в отдельную трубу.Для каждого процесса есть две трубы.Один из них, чтобы родитель мог отправить информацию ребенку.Другой, чтобы родитель мог получить результат сортировки.

До сих пор моей проблемой было чтение ввода.От fputs() я получаю подтверждение того, что я успешно пишу на вход ребенка.После этого я fflush(NULL) и пытаюсь прочитать вывод ребенка.Блоки чтения, как и в нем, никогда не возвращаются и не достигают оператора после fputs.Что довольно странно, так как я считаю, что я установил чтение на O_NONBLOCK.Выходные данные перечислены ниже.

line 174 
line 176 
line 178 

Вот фрагмент кода:

int sort_writes[num_sort][2];
    int sort_reads[num_sort][2];
    int i;
    int *status;
    int flags;
    char buffer[BUFFER_SIZE];
    // this should contain a bunch of write fds wrapped in fdopen
    FILE*  to_sort[num_sort];
    // the same except with reads
    FILE*  from_sort[num_sort];
    //this only include for simplicity and so that exec will happen proper
    char *sort_argv[2];
    sort_argv[0]=(char*)"sort";
    sort_argv[1]= (char *)NULL;

    // This will create all of the pipes for the sorts.
    // The parent will read  0 and the even pipes. it will write to the odd.
    for(i=0; i< num_sort; i++){
            //parent  reads from this pipe. child writes to it.
                    assert(pipe(sort_writes[i]) == 0);

            //parent write to this pipe. child reads from it.
                    assert(pipe(sort_reads[i]) ==0);
                    switch(fork()){
                            case 0: //this is the child
                                    //this closes unnecessary fds
                                    _close_less_than(i, sort_writes);
                                    _close_less_than(i, sort_reads);
                                    dup2(sort_reads[i][0], STDIN_FILENO);
                                    // standard out becomes parent pipe in
                                    dup2(sort_writes[i][1], STDOUT_FILENO);
                                                                                                   execv(SORT_LOC.c_str(), sort_argv);
                            default: // this the parent.
                                    //clean up. close unused.
                                    close(sort_writes[i][1]);
                                    close(sort_reads[i][0]);
                    }

    }
    //Creates a file pointer for all of the fds I will use to communicate with my sorts
    //It also sets all reads to nonblock and the parent write stdio buffers to zero.        
    for(i=0; i< num_sort; i++){
            assert((from_sort[i]= fdopen(sort_writes[i][0] ,"r")) != NULL);
            assert((to_sort[i]= fdopen(sort_reads[i][1] , "w")) != NULL);         //pipes ignore truncate

            flags = fcntl(sort_writes[i][0], F_GETFL);
            flags |= O_NONBLOCK;
            fcntl(sort_writes[i][0], F_SETFL, flags);


    }

    for(i=0; i<(int)theArray.size(); i++){
            fputs(theArray.back().c_str(), to_sort[i % num_sort]);
            theArray.pop_back();
            fflush(NULL); // so that the data gets from stdio buffers to pipe buffers.      
    }
    cout << "line 174 \n";
    for(i=0; i <1; i++){
            cout << "line 176 \n";
            while(!feof(from_sort[i])){
                    cout << "line 178 \n";
                    cout << fgets(buffer, BUFFER_SIZE, from_sort[i]);
                    cout << buffer;
                    cout << "at least i tried \n";
            }

1 Ответ

2 голосов
/ 10 февраля 2012

Вы забыли dup2 и close до exec. С таким кодом sort понятия не имеет, какой дескриптор файла для чего использовать. Я не знаю, что делает _close_less_than, но если он закрывает дескрипторы 0, 1 или 2, вы вызываете sort в среде, которую он не может понять. Вы должны подключить свои трубы к стандартным и обычным детям.

...