C STDIN_FILENO是/bin/more的默认输入吗?
我用一个小C代码编写了一个非常简单的管道,其中父进程写入管道,子进程读取管道并显示更多内容。我使用了C STDIN_FILENO是/bin/more的默认输入吗?,c,pipe,C,Pipe,我用一个小C代码编写了一个非常简单的管道,其中父进程写入管道,子进程读取管道并显示更多内容。我使用了dup2将读取描述符附加到STDIN else /* where pid=fork() is 0 */ { close(fd[1]); if(fd[0]!=STDIN_FILENO) { if (dup2(fd[0],STDIN_FILENO)!=STDIN_FILENO
dup2
将读取描述符附加到STDIN
else /* where pid=fork() is 0 */
{
close(fd[1]);
if(fd[0]!=STDIN_FILENO)
{
if (dup2(fd[0],STDIN_FILENO)!=STDIN_FILENO)
{
perror("dup2 redirection");
exit(1);
}
}
close(fd[0]);
execl("/bin/more","more",(char *)0);
}
最后一部分取自一些现有代码。我的问题是/bin/more
如何知道它必须在STDIN
上工作。如果我在AIX会话上运行simple more,它会抛出错误。但是,当从C代码运行带有execl
的more时,它运行时没有任何参数,并将STDIN
视为参数。谁能解释一下吗?
我以前也写过简单的管道。我需要使用读取描述符专门读取。但在这里,似乎
/bin/more
在没有被指示读取的情况下执行此操作。是的,more
在没有指定文件读取的情况下读取标准输入。如果输入是管道(或文件),标准输出是终端,那么它将从标准输出读取数据(这听起来很荒谬,但实际上是可行的)。但是,如果输入是一个管道,而标准输出不是一个终端,那么它的行为就被设计成类似于cat
,因为通常它会在输出的每一页末尾从终端读取数据,但无论如何,这就是数据的来源
为了让它“正常”工作,您必须使用“pty”(伪tty)作为输入,这不是一个简单的练习。@Jasen:谢谢;在平板电脑上自动拼写更正是书写时的一种痛苦。谢谢。这是有道理的。但让我困惑的是,这个o/p-$>more无法从终端使用中获取输入:more[-Ncdeilsuvz][t标记]][x选项卡][p命令]][n编号]][W选项][file…]我想我可能得到了答案。我通过删除dup2更改了代码。我得到的错误与在不发送任何参数的情况下运行更多时得到的错误相同。现在,我的C代码与AIX会话匹配。谢谢你的帮助,乔纳森。我以前没有看到过这个用法信息。不过,不同的系统有不同的实现。