1

出力をリダイレクトしようとしていますが、2 つの問題があります。問題 1: ls -l > file は正常に動作しますが、cat file1 > file2 を実行すると、シェルがバックグラウンドで無期限に動作しているように見えます。2〜3分待ってから中断する必要があります(Ctrl-D)。問題 2: ソート < 果物を使用する場合と同じ問題です。私のシェルはプロセスが終了するのを待っているようですが、決して終了しません。だから中断せざるを得ない。私は何か正しいことをしていないことを知っていますが、何が間違っている/欠けているのか理解できないようです. パイプはまだ実装していません。あなたの助けに感謝します。

int create_childprocess(char *argv[], int argc)
{

    //int pid;

    int fd, i, ret;

    pid_t pid;


    int redirect_sign =0;

    if((pid = fork()) == -1)
    {
        /*error exit -fork failed*/
        perror("Fork failed");
        exit(-1);
    }
    if(pid == 0)
    {
        /*this is the child*/
        printf("\nThis is the child ready to execute: %s\n", argv[0]);

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

            if((strcmp(">", argv[i])) ==0)
                redirect_sign=1;

            else if((strcmp(">>", argv[i])) ==0)
                redirect_sign=2; 

            else if((strcmp("<", argv[i])) ==0)
                redirect_sign=3;

             else if((strcmp("<<", argv[i])) ==0)
                redirect_sign=4;  

        }   

        if (redirect_sign==1)  //if ">" is found...
        {

            fd = open(argv[argc-1],O_TRUNC | O_WRONLY | O_CREAT, 0755);
            if(fd == -1)
            {   
                /*An error occured. Print an error message and bail.*/
                perror("open");
                exit(-1);   
            }   
            else
            {
                printf("Writing output of the command %s to file created\n", argv[0]);
                dup2(fd,1);

                execlp(argv[0], argv[0], NULL);
                close(fd);

            }


        }
        else if (redirect_sign==2)  //if ">>" was found...
        {
            fd = open(argv[argc-1], O_WRONLY | O_APPEND | O_CREAT, 0755);
            if(fd == -1)
            {   
                /*An error occured. Print an error message and bail.*/
                perror("open");
                exit(-1);   
            }   
            else
            {
                printf("Appending output of the command %s to file created\n", argv[0]);
                dup2(fd,1);

                execlp(argv[0], argv[0], NULL);
                close(fd);  
            }
        }
        else if (redirect_sign==3)  //if "<" was found...
        {
            fd = open(argv[argc-1], O_TRUNC | O_WRONLY | O_CREAT, 0755);
            if(fd == -1)
            {   
                /*An error occured. Print an error message and bail.*/
                perror("open");
                exit(-1);   
            }   
            else
            {
                printf("Writing content of file %s to disk\n", argv[argc-1]);
                dup2(fd,1);

                execlp(argv[0], argv[0], NULL);
                close(fd);  
            }
        }
        else if (redirect_sign==4)  //if "<" was found...
        {
            fd = open(argv[argc-1], O_TRUNC | O_WRONLY | O_CREAT, 0755);
            if(fd == -1)
            {   
                /*An error occured. Print an error message and bail.*/
                perror("open");
                exit(-1);   
            }   
            else
            {
                printf("Writing content of file %s to %s \n", argv[argc-1], argv[0] );
                dup2(fd,1);


                execlp(argv[0], argv[0], NULL);
                close(fd);  
            }
        }
        else  //if ">" or ">>" or "<" or "<<" was not found 
        {
            execvp(argv[0], &argv[0]);

            /*error exit - exec returned*/
            perror("Exec returned");
            exit(-1);
        }

    }
    else
    {
        /*this is the parent -- wait for child to terminate*/
        wait(pid,0,0);
        printf("\nThe parent is exiting now\n");
    }

    free (argv);
    return 0;
}
4

2 に答える 2

0

コードをよく見ないと、ファイル記述子を閉じていない可能性があります。close(fd)特に、を呼び出す前に絶対execlpに必要であり、作成したパイプ内の他のすべての関連ファイル記述子を閉じていることを非常に注意してください。この特定のエラーを修正して出力ファイルを閉じても、問題が解決しない可能性があります。表示されていないコードにエラーがある可能性が高く、いくつかのパイプを開いたままにcatして、パイプの書き込み側とそのパイプの読み取り側が開いているため、決して来ない EOF を待っています。独自の stdin です。

于 2013-10-21T08:08:29.997 に答える
0

dup2(fd,1); を使用しています。すべての状況で。入力 (stdin) の場合、ファイル記述子 0 (または定義済みマクロ STDIN_FILENO.

于 2013-10-21T08:17:27.253 に答える