0

1 つのパイプを使用して、1 つのコマンドの出力を正常にパイプ処理しました。

各コマンドがプロセスを表す N 個の連続したコマンドでこれを行いたいです。

これは、1 つのコマンドをパイプライン処理する私の試みです。コマンドの N シーケンスを作成するには、n-1 パイプが必要ですか? また、すべてのプロセスの親プロセスが出力を収集して印刷する方法。

そしてありがとうございました 。

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>

int main(int argc ,char *argv[])
{
    int i,pid;
    int fd[2];//crea i descriptor 
    char phrase[30][30];//crea il buffer
    pipe(fd); /* crea la pipe */

    for(i=0;i<argc;i++)
    {
        if((pid=fork())==0)
        {               
            strcpy(phrase[i], argv[i+1]);  
            printf("ho scritoo :'%s'\n",phrase);
            close(fd[0]);                         /* chiude in lettura */
            write(fd[1],phrase[i],strlen(phrase[i])+1); /* invia anche 0x00 */
            close (fd[1]);                   // chiude in scrittura
            // pid=0 -> figlio
            usleep(50000*(1+i));      // Ritardo iniziale
            printf("Figlio: %d\n",i+1);   // Stampa messaggio del figlio
            usleep(500000*(1+i));     // Ritardo finale
            return(101+i);            // Termina con codice di ritorno
        } else { 
            printf("Ho generato il figlio %d con pid %d\n",i+1,pid);
            char message[100];    //creare il buffer 
            memset(message,0,100);
            int bytesread;  

            bytesread = read(fd[0],message,sizeof(message));
            printf("ho letto dalla pipe %d bytes: '%s' \n",bytesread,message);
            // close(fd[0]);
        }
    }
    close(fd[0]);                         /* chiude in scrittura */
    close(fd[1]);                         /* chiude in scrittura */
    // Attende che dieci processi terminino
    for(i=0;i<argc-1;i++)
    {
        int status;
        wait(&status);      // Attende termine di un figlio (uno qualunque)
        printf("Terminato processo %d\n",WEXITSTATUS(status));
    }
    return 0;
}
4

1 に答える 1

0

はい、N 個のプロセスに対して N-1 個のパイプがあります。すべてのプロセスを標準出力に出力するだけです。各子プロセスは親の stdout を継承するため、それらはすべて、親の stdout が設定されているものに出力されます。stdout をファイルにリダイレクトしてチェーンを開始すると、それらはすべてそのファイルに出力されます。問題は、書き込みを同期して、別の書き込みの途中で書き込みを行わないようにすることです。

すべての子出力を元の親にパイプで戻したい場合は、各子に、自分の子のパイプから読み取ったすべてを親のパイプに書き込むだけにすることができます。各子は、この方法でチェーンを上に渡します。

于 2013-04-07T11:47:17.037 に答える