发布网友 发布时间:2022-04-23 18:23
共3个回答
热心网友 时间:2023-10-12 19:41
输入输出都有缓冲区概念,在输入hello world不回车,其实已经放到了read缓冲区中,在超时关闭read()的时候,系统会flush缓冲区,其实就是把它放到内存中,所以这时候n已经有值了,write当然会输出hello world了。追问read() 函数是一个系统函数,不像scanf这样的库函数,是不带缓冲区的。并且程序在还没来的及执行write() 前就调用exit()退出了。我尝试把exit() 换成_exit()(不会flush stdio 缓冲区)输出同样的结果。所以我认为不是flush缓冲区的原因。
追答程序设定无缓冲并不表示操作系统不缓冲(raw),而且还涉及硬件缓冲。一旦flush缓冲,n大于0,if条件不成功,自然执行write()函数。
看看这个吧:http://hi.baidu.com/david_jlu/blog/item/2e5e873047cf619da8018e33.html
热心网友 时间:2023-10-12 19:41
这个跟系统预设的信号FLAG有关,read函数是系统调用实现的,你用的操作系统默认的信号设置是接收到信号并处理后会重新启动系统调用类的函数,所以会卡主,你可以使用sigaction函数安装并设置信号,以下为SIGALRM设置的处理代码:
struct sigaction act, oldact;
act.sa_handler = setTimeout; //这里等价于signal的第一个参数
act.sa_flags = !SA_RESTART;//这里系统默认是SA_RESTART,当然有的系统就不是,没猜错你用的是LINUX吧,LINUX是我用过的唯一默认为SA_RESTART的系统
sigaction(SIGALRM, &act, &oldact);//实际上第三个参数现在是未使用的貌似,我没试过,不过用的话也是返回的,可以不关注
热心网友 时间:2023-10-12 19:42
linux的read 本身有一个参数,是来控制输入时间的吧