Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 命令输出(stdout、stderr)未重定向到管道_C_Linux_Tty_Ioctl - Fatal编程技术网

C 命令输出(stdout、stderr)未重定向到管道

C 命令输出(stdout、stderr)未重定向到管道,c,linux,tty,ioctl,C,Linux,Tty,Ioctl,我在从专有二进制文件重定向stdout和stderr时遇到问题 在使用strace工具进行了一些反向工程之后,我在标准描述符上发现了奇怪的ioctl调用 谁能解释一下那叫什么 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0

我在从专有二进制文件重定向stdout和stderr时遇到问题

在使用strace工具进行了一些反向工程之后,我在标准描述符上发现了奇怪的ioctl调用

谁能解释一下那叫什么

ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0

这没什么奇怪的。它只获取终端参数,即来自您运行的xterm的/dev/pts/X设备的参数

从tcgetattr的手册页(与TCGETS相同)中,请参见手册tty_ioctl:

tcgetattr获取与fd引用的对象关联的参数,并将其存储在termios\p引用的termios结构中。此函数可以从后台进程调用;然而,终端属性随后可由前景处理来改变


它是否也会在使用管道时发出此呼叫?它可能正在测试STDIN和STDOUT是否在tty上。它被调用,但如果进程是管道化的,ioctl返回=-1 ENOTTY设备istead=0的ioctl不合适,之后不会写入STDOUT。。。嗯,谢谢,现在我明白发生了什么。我可以欺骗procces或者用任何其他技巧将输出重定向到文件吗?我仍然不明白,它是如何影响std流的?如果我理解正确,只能从tty获取参数。你能给我更多关于第三个ioctl参数的信息吗?@Dcow,是的,它获取tty参数。ioctl调用中的第三个参数依赖于ioctl。在TCGETS ioctl的情况下,termios结构包含描述终端的各种标志:在您的情况下,它的38400是以位/秒为单位的速度,echo表示tty显示输入字符,等等。