我在Unix中编写shell,当我运行ls | wc > file
时,它运行良好,但是当我运行ls > file
时,我的程序挂起并且对任何事情都没有反应。命令ls
写入文件的结果,以及所有后续函数被处理,并输出到终端,但程序不响应键盘输入。在程序开始时,我断开连接
termios.c_lflag = (termios.c_lflag ^ ICANON) ^ ECHO;
tcsetattr(2, TCSANOW, &termios);
但是,如果ls | wc > file
一切顺利,那就不应该是原因。
在此功能中,我们采用fd,fd[1] = open(file, O_RDWR | O_CREAT | O_TRUNC, 0666)
和fd[0] = 0
或fd[0] = in
,其中in = fd[1]
来自之前的pipe(fd)
。
我无法理解,为什么会这样?请帮帮我)
还有一个问题,为什么后面的“C”在execve
之后没有写到终端和文件?后面的“A”写入终端,“B”写入文件的开头,“C”丢失,“D”进入终端。
void command_to_file(char *f_pth, char **mas, char **env, int *fd)
pid_t pid;
pid = fork();
if (pid == 0)
{
write(1, "A", 1);
ft_putendl(mas[0]);
dup2(fd[0], 0);
dup2(fd[1], 1);
write(1, "B", 1);
if (execve(f_pth, mas, env) < 0)
{
write(2, "error execve", 12);
return ;
}
write(1, "C", 1);
write(2, "C", 1);
close(fd[0]);
}
else
{
wait(0);
write(1, "D", 1);
close(fd[1]);
}