我正在开发一个个人shell并开始实现重定向。
'<'工作正常,'>'仅适用于cat命令。
以下是处理'>'效果的代码:
int write_in_file(char **tab, int fd)
{
int count;
char i;
if (strncmp("cat", tab[0], 3) == 0)
{
while ((count = read(0, &i, 1)) > 0)
write(fd, &i, 1);
exit(1);
}
else if (strncmp("ls", tab[0], 2) == 0)
{
/* Here handle other commands then cat */
}
else
return (0);
}
如您所见,当shell识别
时cat > file
它做它应该做的事情:让用户写入所述文件。 但现在我想处理其他命令,如
ls > file
man ascii > file
你们有什么想法我能做到吗? 如果您需要任何精确度,请告诉我,
编辑:请注意,我在此功能中处于子进程中。
提前致谢。
答案 0 :(得分:0)
当shell调用exec
(启动eg.cat或man)时,程序将继承之前设置的所有文件句柄。程序将使用0作为stdin,1作为stdout,2作为stderr。如果要将输出重定向到文件,您将打开输出文件并使用dup2
将其设置为文件编号1.通常所有这些都是在fork
之后完成的。
请参阅GNU C Library: Duplicating Descriptors和GNU C Library: Launching jobs
您不应该使用strncmp(command, "cat", 3)
检查命令是否为cat,因为这也将匹配catman或catdvi,但不适用于"猫&#34 ;.而是使用标记器,例如strtok
。