Смущен реализацией умножения в оболочке - PullRequest
0 голосов
/ 02 ноября 2011

Итак, я пытался реализовать конвейер в моей собственной программе оболочки, чтобы я мог действительно понять, что делает UNIX.Я сейчас очень, очень близок, но по какой-то причине моя программа заходит в бесконечный цикл, когда я транслирую.Я почти уверен, что моя проблема проистекает из моих аргументов waitpid, которые не позволяют закрывать последний канал, потому что, если я сделаю последний цикл в приведенном ниже коде, то я буду меньше, чем count-1, а не меньше, чем count, он будет работатькоманда слева от трубы.Но как только я возвращаю его обратно, я меньше, чем считаю, он просто зацикливается навсегда.

           if(pipes)
                   {
            for (i=0;i<count-1;i++)
            {

                 if( pipe(fd) ==-1)
                 {
                 perror("Pipe failure");
                 return;
                 }

                read[i+1] = fd[0];
                write[i] = fd[1];
            }
        }

    for(i=0;i<count;i++)
    {
        pid = fork();

        if(pid < 0)
        {printf("fork failed");}

        else if(pid>0)
        {pids[i] = pid;}
        else
        { 
            if(write[i] != -1)
            {
                if(dup2(write[i],STDOUT_FILENO) ==-1)
                {
                perror("dup2 failure");
                exit(1);
                }
            }
            if(read[i] !=-1)
            {
                if (dup2(read[i], STDIN_FILENO)==-1)
                {
                perror("dup2 failure");
                exit(1);
                }
            }
        for (j=0; j<count; j++)
            {
            close(write[j]);
            close(read[j]);
            }

    execvp(input[i], input);
    exit(1);
        }//end else
    }//end for


  for(i=0; i < count; i++){


  if(write[i] != -1)
  close(write[i]);

  if( read[i] != -1)
  close (read [i]);

  waitpid(pids[i], &status,0);
 }
           }
    return (status);}

Я думаю, что я действительно очень близок к решению, но на данный момент я застрял.Я исследовал тонну, но думаю, я просто не совсем понял.Спасибо за любую помощь.

1 Ответ

1 голос
/ 02 ноября 2011

Пожалуйста, отформатируйте ваш код. Сейчас не читается.

Как говорится, несколько ошибок:

  • Вы не устанавливаете write[0]. Вы устанавливаете write[count-1] и read[count].
  • Вы ожидаете pids[i], пока у родителя по-прежнему read[i] открыто. Если input[i] want не выйдет, пока не получит EOF на stdin, это никогда не произойдет.
...