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
どんな助けでも大歓迎です。