0

2 つの子プロセスを作成しようとしています。

1 つの子は、引数として渡されたファイルから入力を読み取り、出力をパイプに書き込みます。

もう 1 つの子はパイプから出力を読み取り、その出力をファイルに書き込みます。これも引数として渡されます。

親は子のファイル記述子の一部を設定し、子が作成されると、必要に応じて記述子の操作を終了します。

ただし、ファイル記述子の設定に問題があります。具体的には、入力ファイル記述子を閉じて複製して標準入力の代わりに使用しようとすると、問題が発生します。

ここにすべての私のコードがあります:

#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char *argv[])
{
    //Open input file
    int fdin;
    fdin = open(argv[1], O_RDONLY);
    //Check if opening the file was successful
    if(fdin > 0)
    {
        //Open output file
        int fdout;
        //Create the output file and
        //check if the output file was created
        if((fdout = creat(argv[2], 0644)) > 0)
        {
            //Captures whether the dup's were successful
            int dup_in;
            int dup_out;

            //Close stdin so we can replace it with our input file
            close(0);
            //Attempt to put the input file at position 0
            //and check if the dup was successful
            if((dup_in = dup(fdin)) > 0)
            {
                //Close stdout so we can replace it with our output file
                close(1);

                //Attempt to put the output file at position 1
                //and check if the dup was successful
                if((dup_out = dup(fdout)) > 0)
                {
                    //Pipe success
                    int pipecreate;
                    //Pipe file descriptors
                    int pipe_fd[2];

                    //Make the pipe and check
                    //if it was successful
                    if((pipecreate = pipe(pipe_fd)) > 0)
                    {
                        //close unneeded file descriptors
                        close(fdin);
                        close(fdout);

                        //Process id for first child
                        int cpid1;
                        //Create first child process
                        cpid1 = fork();

                        //Process creation successful, child block
                        if(cpid1 == 0)
                        {
                            //Read pipe dup success
                            int rpipe_dup;
                            //close f_in
                            close(0);

                            rpipe_dup = dup(pipe_fd[0]);

                            //Dup successful
                            if(rpipe_dup > 0)
                            {
                                //close uneeded file descriptors
                                close(pipe_fd[0]);
                                close(pipe_fd[1]);

                                execl("count", "count", (char *) 0);

                                char readbuf[100] = {0};

                                read(2, readbuf, 100);
                            }
                            //Dup failed
                            else
                            {
                                fprintf(stderr, "Read pipe dup failed.\n");
                                exit(EXIT_FAILURE);
                            }
                        }
                        //Process creation successful, parent block
                        else if(cpid1 > 0)
                        {
                            //Process id for second child
                            int cpid2;
                            //Create second child process
                            cpid2 = fork();

                            //Process creation successful, child block
                            if(cpid2 == 0)
                            {
                                //Write pipe dup success
                                int wpipe_dup;
                                //close f_out
                                close(1);

                                wpipe_dup = dup(pipe_fd[1]);

                                //Dup successful
                                if(wpipe_dup > 0)
                                {
                                    //close uneeded file descriptors
                                    close(pipe_fd[0]);
                                    close(pipe_fd[1]);

                                    execl("convert", "convert", (char *) 0);

                                    char readbuf[100] = {0};

                                    write(1, readbuf, 100);
                                }
                                //Dup failed
                                else
                                {
                                    fprintf(stderr, "Write pipe dup failed.\n");
                                    exit(EXIT_FAILURE);
                                }
                            }
                            //Process creation successful, parent block
                            else if(cpid2 > 0)
                            {
                                //Close unneeded file descriptors
                                close(pipe_fd[0]);
                                close(pipe_fd[1]);

                                int pid;
                                int status;

                                pid = wait(&status);
                                pid = wait(&status);

                            }
                            //Dup failed
                            else
                            {
                                fprintf(stderr, "Error creating child process 2.\n");
                                exit(EXIT_FAILURE);
                            }
                        }
                        //Process creation unsuccessful
                        else
                        {
                            fprintf(stderr, "Error creating child process 1.\n");
                            exit(EXIT_FAILURE);
                        }
                    }
                    //Pipe creation failed
                    else
                    {
                        fprintf(stderr, "Error creating pipe.\n");
                        exit(EXIT_FAILURE);
                    }
                }
                //Dup'ing the output file descriptor failed
                else
                {
                    fprintf(stderr, "Error dup'ing out file descriptor.\n");
                    exit(EXIT_FAILURE);
                }
            }
            //Dup'ing the input file descriptor failed
            else
            {
                //fprintf(stderr, "Error dup'ing in file descriptor.\n
                perror("\nError dup'ing in file descriptor: ");
                exit(EXIT_FAILURE);
            }
        }
        //Creat failed
        else
        {
            fprintf(stderr, "Error creating out file.\n");
            exit(EXIT_FAILURE);
        }
    }
    //Opening input file failed
    else
    {
        fprintf(stderr, "Error opening in file.\n");
        exit(EXIT_FAILURE);
    }
}

これをMINIX3でコンパイルして実行しています。

プログラム出力を含め、実行方法は次のとおりです。

cc fork.c
./a.out input.txt output.txt

Error dup'ing in file descriptor: : Undefined error: 0

どんな助けでも大歓迎です。

4

1 に答える 1

0

その理由がわかりました。

dupこの場合は 0 であるファイル記述子番号を返しif ((dup_in = dup(fdin)) > 0)ますif ((dup_in >= dup(fdin)))

于 2014-09-26T18:20:01.197 に答える