建站学 - 轻松建站从此开始!

建站学-个人建站指南,网页制作,网站设计,网站制作教程

当前位置: 建站学 > 服务器 > Linux教程 >

Linux:write调用的原子性(2)

时间:2011-03-03 15:00来源: 作者: 点击:
2.管道 SUS对管道的写操作说得更多也更明确,我们只需遵照其标准就可以了。对于write(pipefd, buf, nbyte),其要点如下: 如果nbyte = PIPE_BUF,不管O_NONBLOCK是否设置,其写操作都是原子的,就是说多个进程都在此

2.管道
SUS对管道的写操作说得更多也更明确,我们只需遵照其标准就可以了。对于write(pipefd, buf, nbyte),其要点如下:
如果nbyte <= PIPE_BUF,不管O_NONBLOCK是否设置,其写操作都是原子的,就是说多个进程都在此条件下同时写同一个管道不会引起数据交错。
如果nbyte > PIPE_BUF,是不能保证写操作是原子的,写入的数据可能与其他进程写入的数据交错。

3.socket
SUS中对于写socket并没有说很多,我们无法从标准中得知write是否保证写操作的原子性。我看了一下linux 2.6.14内核关于tcp数据的写操作,发现它不是原子的,也从网上查到了这部分代码的作者(们)对这个问题的看法,他(们)认为对一个可能永久阻塞的操作保证原子性是错误的。我们也只能姑且这么认为了。

补充:

对于用UNIX日志系统服务器的方法,连接端必须每个线程connect一次logsvr,这样才能保证发过来的日志数据不互相错乱,保证原子性;此时logsvr只要用reactor方法来处理每个线程的连接就好,把这些fd放到队列里轮流处理,写文件,也保证了写文件的原子性。

实际上日志服务器一般都是用UDP来完成的。
 

 

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片