IO重定向和缓冲区问题,fflush和c

IO重定向和缓冲区问题,fflush和c,c,buffer,io-redirection,dup,fflush,C,Buffer,Io Redirection,Dup,Fflush,对于我的类,我们将实现一个带有输出重定向的shell。我的输出重定向正常工作,但我的第一个命令始终损坏。请参见: $ echo this doesn't work H<@?4echo No such file or directory $ echo this does work this does work $echo这不起作用 h0){ strncpy(输出文件,orderedIds[numFile],strlen(orderedIds[numFile]); numFile=0; //

对于我的类,我们将实现一个带有输出重定向的shell。我的输出重定向正常工作,但我的第一个命令始终损坏。请参见:

$ echo this doesn't work
H<@?4echo
No such file or directory
$ echo this does work
this does work
$echo这不起作用
h0){
strncpy(输出文件,orderedIds[numFile],strlen(orderedIds[numFile]);
numFile=0;
//打开输出文件
outputfd=打开(outputFile,O|u WRONLY | O|u CREAT | O|u TRUNC,S|u IRWXU | S|u IRGRP | S|u IROTH);
如果(输出fd<0){
退出(退出失败);
}
//闭式STDOUT
如果(关闭(标准输出文件号)<0){
perror(“关闭(2)文件:STDOUT_FILENO”);
关闭(outputfd);
退出(退出失败);
}
//使用dup重新输出
如果(已保存)\u stdout=dup(outputfd)!=stdout\u文件号){
perror(“dup(2)”);
关闭(outputfd);
退出(退出失败);
}
关闭(outputfd);
}
if(execvp(orderedIds[0],orderedIds)){
printf(“%s\n”,orderedds[0]);
put(strerror(errno));
出口(127);
}
}
dup2(保存的输入、输出FD);
清洁(订购EDIDS);
fflush(0);
printf($);
}否则{
strncat(温度和温度,1);
}
}
fflush(0);
返回0;
}

产生垃圾的原因是您从未在
main()
的开头将
temp
初始化为空字符串。在处理每个命令后调用
init(temp)

代码中还有很多其他问题:

orderedIds[i] = malloc(MAXCMD * sizeof(char*));
由于
orderedds[i]
是一个字符数组,而不是char*,因此应该将大小乘以
sizeof(char)
。另外,还不清楚为什么要使用
MAXCMD
作为大小——在前一行中,这是一行中的最大字数,而不是一个单词中的字符数

strcpy(orderedIds[k], tok);
您应该使用
strncpy()
来确保复制的大小不会超过
orderedds[k]
的大小

另一个选择是不首先预先分配所有的
orderedds[i]
。不要使用strcpy(),而是使用strdup()并将其分配给orderedds[k];如果这样做,您必须记住
free()
所有这些字符串

第三种选择是根本不复制字符串。只需将strtok()返回的指针分配给orderedds[k]。但是在这种情况下,您必须在分叉之后才能调用
init(tmp)

strncpy(outputFile, orderedIds[numFile], strlen(orderedIds[numFile])); 
限制应该是
outputFile
的大小,而不是
orderedds[numFile]
的长度
strncpy()
复制的长度永远不会超过源的长度,您需要告诉它目标的最大大小,以防止缓冲区溢出

outputfd = open(outputFile, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU | S_IRGRP | S_IROTH); 
if (outputfd < 0) {
   exit(EXIT_FAILURE);
}

调用
peror()
,就像你在其他地方做的那样。

你可以通过向我们展示(a)一个失败的命令集的示例,(b)成功时它应该是什么样子,以及(c)用你迄今为止采取的任何调试步骤来启发我们,从而为我们省去很多问题。输入“第一个命令”不是选项。请提供详细的步骤,说明您的shell应该接受什么作为输入,以及它的输出应该是什么样子。将执行。正如我所展示的一个失败的命令集的例子是“first command”,它应该告诉我“first”不是这样的文件或目录,而是它前面有一些垃圾。我将编辑该问题,以显示您所问的更多内容。就调试而言,这是我唯一要问的问题:我使用什么技术来查找bug?到目前为止,我已经尝试过使用fflush,但没有成功。@WhozCraig我知道,我建议他使用
peror()
,这样他就可以添加该消息了。他在程序的其他部分也会做,他也应该在那里做。
outputfd = open(outputFile, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU | S_IRGRP | S_IROTH); 
if (outputfd < 0) {
   exit(EXIT_FAILURE);
}
puts(strerror(errno));