You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x86 Linux汇编sys_read调用文件描述符异常运行的技术问询

为什么修改sys_read的文件描述符为stdout(1)后程序仍能正常运行?

这问题挺反直觉的对吧?我来给你捋清楚背后的原因:

  • 终端设备是双向可读可写的:默认情况下,Linux程序的stdin(0)、stdout(1)、stderr(2)三个文件描述符都指向同一个终端设备(比如你正在用的控制台窗口)。而终端设备本身是双向的——它既可以接收你的输入(供读操作),也可以输出内容(供写操作)。所以不管你用哪个指向终端的fd调用sys_read,内核都会从终端读取输入,只要这个fd是有效的。

  • stdout的默认打开权限包含读权限:当shell启动你的程序时,它会以可读可写的模式打开终端设备,并把fd 0、1、2都关联到这个设备上。也就是说,fd 1(stdout)不仅有写权限,还有读权限。所以当你调用sys_read(1, buf, len)时,内核检查到这个fd是合法的且允许读操作,就会正常执行读取。

  • 重定向后就会失效:你可以做个小测试:如果把程序的stdout重定向到一个普通文件,比如运行./your_program > test.txt,这时候再输入内容,程序就会读取失败了。因为此时fd 1指向的是普通文件,而默认重定向stdout时是用O_WRONLY(只写)模式打开的,sys_read调用会返回EBADF(错误的文件描述符)错误。

你也可以用strace工具跟踪系统调用,看看sys_read的返回值和具体行为,比如执行strace ./your_program,就能清晰看到内核对每个系统调用的处理结果。

内容的提问来源于stack exchange,提问作者Ashish Rana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:30:20