我正在制作一个小shell,我的两个函数遇到了一些问题。 它们有点脱离背景,但我希望你能理解我想要做的事情,所以我不必发布我的整个代码。
我的dupPipe功能:
我想将管道复制到std I / O文件描述符并关闭两个管道末端。它看起来像这样:int dupPipe(int pip[2], int end, int destinfd);
。 where end告诉哪个管道要复制,READ_END或WRITE_END和destinfd告诉要替换哪个std I / O文件描述符。
我的重定向功能:
它应该将std I / O文件描述符重定向到文件。
它看起来像这样int redirect(char *file, int flag, int destinfd);
。
其中flag表示是否应该读取或写入文件,destinfd是我要重定向的std I / O文件描述符。
我做了什么:
int dupPipe(int pip[2], int end, int destinfd)
{
if(end == READ_END)
{
dup2(pip[0], destinfd);
close(pip[0]);
}
else if(end == WRITE_END)
{
dup2(pip[1], destinfd);
close(pip[1]);
}
return destinfd;
}
第二功能:
int redirect(char *filename, int flags, int destinfd)
{
if(flags == 0)
{
return destinfd;
}
else if(flags == 1)
{
FILE *f = fopen(filename, "w");
if(! f)
{
perror(filename);
return -1;
}
}
else if(flags == 2)
{
FILE *f = fopen(filename, "r");
if(! f)
{
perror(filename);
return -1;
}
}
return destinfd;
}
我感谢任何给予的帮助,我做错了什么或者没有完成我写的想要的功能?感谢。
答案 0 :(得分:0)
redirect
功能似乎没有做你想要的。您正在使用fopen
打开文件,但不会以任何方式将其链接到destinfd
。您可能希望使用open
,然后使用dup2
将文件描述符移动到您想要的位置。
int redirect(char *filename, int flags, int destinfd)
{
int newfd;
if(flags == 0) {
return -1;
} else if(flags == 1) {
newfd = open(filename, O_WRONLY);
if (newfd == -1) {
perror("open for write failed");
return -1;
}
} else if(flags == 2) {
newfd = open(filename, O_RDONLY);
if (newfd == -1) {
perror("open for read failed");
return -1;
}
} else {
return -1;
}
if (dup2(newfd, destinfd) == -1) {
perror("dup2 failed");
close(newfd);
return -1;
}
close(newfd);
return destinfd;
}