草庐IT

Write-Ahead

全部标签

c - 向设备发送数据时 UNIX read()/write() 的原子性

当直接写入/dev中的设备时,我打开一个文件描述符并执行UNIXwrite(),然后执行read()。我能否让多个线程在相同文件描述符上执行此write()/read()序列,并且如果两个线程同时进入write()函数则不会得到困惑的数据?对std文档的引用将非常有帮助。我什么也没找到。有人提到这样的操作在内核中是原子的,但我持怀疑态度。此外,要澄清这是/dev中的一个文件,因此任何关于“文件指针”概念在此处适用范围的任何见解也很有帮助。 最佳答案 文件指针(例如FILE*fp)是位于函数调用(例如write())之上的用户端代码中

linux - Linux 文件系统的 "atomic disk write"是什么?

来自nginx配置文件自述文件:access_log:AnoptionalthirdparameterindicatesthesizeofthebufferIfwritebufferingisused,thissizecannotexceedthesizeoftheatomicdiskwriteforthatfilesystem. 最佳答案 这实际上取决于所使用的文件系统。这可能是指stat.blksize文件系统属性。来自stat(2)手册页:structstat{/*...*/blksize_tst_blksize;/*bloc

linux - Linux 文件系统的 "atomic disk write"是什么?

来自nginx配置文件自述文件:access_log:AnoptionalthirdparameterindicatesthesizeofthebufferIfwritebufferingisused,thissizecannotexceedthesizeoftheatomicdiskwriteforthatfilesystem. 最佳答案 这实际上取决于所使用的文件系统。这可能是指stat.blksize文件系统属性。来自stat(2)手册页:structstat{/*...*/blksize_tst_blksize;/*bloc

c - write() 错误地址

我正在尝试写出定义为的字符串的大小(以字节为单位)#definePATHA"/tmp/matrix_a"使用代码rtn=write(data,(strlen(PATHA)*sizeof(char)),sizeof(int));if(rtn我回来了Writingdata_file2:Badaddress这个错误地址到底是怎么回事?数据文件描述符是打开的,并在上述代码段前后正确写入。要写入文件data的数据需要是原始数据,而不是ASCII。我也尝试过将字符串定义为具有相同问题的char[] 最佳答案 write()的第二个参数是您要写入

c - write() 错误地址

我正在尝试写出定义为的字符串的大小(以字节为单位)#definePATHA"/tmp/matrix_a"使用代码rtn=write(data,(strlen(PATHA)*sizeof(char)),sizeof(int));if(rtn我回来了Writingdata_file2:Badaddress这个错误地址到底是怎么回事?数据文件描述符是打开的,并在上述代码段前后正确写入。要写入文件data的数据需要是原始数据,而不是ASCII。我也尝试过将字符串定义为具有相同问题的char[] 最佳答案 write()的第二个参数是您要写入

c - 为什么 write(2) 不返回 EINTR?

我一直在阅读关于write(2)等的EINTR,并试图确定我是否需要在我的程序中检查它。作为完整性检查,我尝试编写一个会遇到它的程序。程序永远循环,重复写入文件。然后,在一个单独的shell中,我运行:whiletrue;dopkill-HUPtest;done但是,我从test.c看到的唯一输出是来自信号处理程序的.。为什么SIGHUP不会导致write(2)失败?测试.c:#include#include#include#include#include#include#include#includevoidhup_handler(intsig){printf(".");fflush

c - 为什么 write(2) 不返回 EINTR?

我一直在阅读关于write(2)等的EINTR,并试图确定我是否需要在我的程序中检查它。作为完整性检查,我尝试编写一个会遇到它的程序。程序永远循环,重复写入文件。然后,在一个单独的shell中,我运行:whiletrue;dopkill-HUPtest;done但是,我从test.c看到的唯一输出是来自信号处理程序的.。为什么SIGHUP不会导致write(2)失败?测试.c:#include#include#include#include#include#include#include#includevoidhup_handler(intsig){printf(".");fflush

linux - write() 系统调用何时写入所有请求的缓冲区,而不是只进行部分写入?

如果我指望我的write()系统调用写入例如100个字节,我总是将write()调用放在一个循环中,该循环检查返回的长度是否是我期望发送的长度,并且,如果不是,它会增加缓冲区指针并将长度减少写入的量。所以我又一次这样做了,但是现在有StackOverflow,我可以问你们大家是否知道我的写入什么时候会写出我要求的所有内容,而不是给我部分写入?附加评论:X-Istence的回复提醒我,我应该注意到文件描述符是阻塞的(即,不是非阻塞的)。我认为他是在建议阻塞文件描述符上的write()不会写入所有指定数据的唯一方法是write()被信号中断时。这似乎至少对我来说具有直觉意义......

linux - write() 系统调用何时写入所有请求的缓冲区,而不是只进行部分写入?

如果我指望我的write()系统调用写入例如100个字节,我总是将write()调用放在一个循环中,该循环检查返回的长度是否是我期望发送的长度,并且,如果不是,它会增加缓冲区指针并将长度减少写入的量。所以我又一次这样做了,但是现在有StackOverflow,我可以问你们大家是否知道我的写入什么时候会写出我要求的所有内容,而不是给我部分写入?附加评论:X-Istence的回复提醒我,我应该注意到文件描述符是阻塞的(即,不是非阻塞的)。我认为他是在建议阻塞文件描述符上的write()不会写入所有指定数据的唯一方法是write()被信号中断时。这似乎至少对我来说具有直觉意义......

c - 有没有更简洁的方法来可靠地使用 write() 函数?

我阅读了man页面,我的理解是如果write()失败并将errno设置为EAGAIN或EINTR,我可能会再次执行write(),所以我想出了以下代码:ret=0;while(ret!=count){write_count=write(connFD,(char*)buf+ret,count);while(write_count我在套接字上执行read()和write()并像上面一样处理read()。我正在使用带有gcc编译器的Linux。 最佳答案 那里有点“不要重复自己”的问题-不需要两次单独调用write,也不需要两个嵌套循环。