我试图创建两个子进程:çDUP未定义的错误
的儿童读取一个文件,该文件被传递作为参数的输入,并写入到输出管道。
另一个孩子从管道读取其输出并将其输出写入一个文件,该文件也作为参数传入。
父级为子级设置了一些文件描述符,并且在创建子级时,他们完成了操作描述符以满足其需要。
但是,我遇到了设置文件描述符的问题,特别是当我尝试关闭并复制输入文件描述符以代替stdin时。
这里是我的所有代码:
#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
任何帮助是极大的赞赏。
我发现了原因。 DUP返回文件描述符,其在这种情况下是0。 如果((dup_in = DUP(fdin))> 0) 应 如果((dup_in> = DUP(fdin))> 0) – braab 2014-09-25 01:13:37
如果你已经找到了你的问题的答案,发布作为答案,而不是评论。 – indiv 2014-09-25 01:43:13