- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我经历了各种不同的名为管道客户端/服务器实现的Linux,但其中大多数在读取/写入时使用默认阻止功能。
因为我已经在使用poll()来检查其他标志,所以也可以通过poll()来检查传入的FIFO数据,这是一个好主意...
经过所有研究,我认为以O_RDWR模式打开管道是防止在没有任何编写者打开管道的情况下无限期发生EOF事件的唯一方法。
这样,管道的两端都关闭了,其他客户端也可以打开可写端。作为回应,我将使用单独的管道...
我的问题是,尽管我发现一些使用O_RDWR标志的示例,但open()联机帮助页将该标志描述为在分配给FIFO时未定义。 (http://linux.die.net/man/3/open)
但是如何在没有O_RDWR的管道上使用poll()?您认为“O_RDWR”是打开管道的合法方法吗???
最佳答案
首先,一些预备:
使用O_NONBLOCK
和poll()
是常见的做法-并非相反。为了成功工作,您需要确保正确处理所有poll()
和read()
返回状态:
read()
返回0
清除。您可能需要在尝试poll()
之前检查POLLHUP
,但这不是绝对必要的,因为可以保证POLLHUP
在写端关闭后返回read()
。 read()
,并且拥有0
,那么您将反复得到EOF(read()
返回O_RDONLY | O_NONBLOCK
),您已经注意到。但是,如果在调用read()
之前使用0
等待poll()
事件,它将等待编写器连接,而不产生EOF。 POLLIN
返回值read()
通常表示错误。但是,如果使用read()
,这仅意味着现在没有更多数据可用,并且您没有阻塞,因此可以返回到-1
以防其他设备需要处理。如果是errno == EAGAIN
,则poll()
在读取任何数据之前已被中断,您可以返回errno == EINTR
或直接立即再次调用read()
。 poll()
在阅读侧打开,则:read()
将阻塞,直到打开了相应的编写器。 O_RDONLY
将提供open()
清除。 poll()
将一直阻塞,直到读取请求的字节数,关闭连接(返回0),被信号中断或出现致命的IO错误为止。这种阻塞性的做法破坏了使用POLLIN
的目的,这就是为什么read()
几乎总是与poll()
一起使用的原因。您可以使用poll()
在超时后从O_NONBLOCK
中唤醒,但这太复杂了。 alarm()
read()
revent,并且poll()
之后将无限期地返回POLLHUP
。此时,读取器必须关闭其文件句柄并重新打开它。read()
在阅读侧打开,则:0
将不会被阻止。 O_RDONLY | O_NONBLOCK
将提供open()
清除。 poll()
也将阻塞,直到没有可用的编写器为止。 POLLIN
将返回-1并设置poll()
,或者如果连接已关闭(EOF)或尚未由编写器打开,则read()
将返回errno == EAGAIN
。当使用0
时,这意味着该返回到errno == EAGAIN
了,因为该连接已打开,但是没有更多数据了。当poll()
时,errno == EINTR
尚未读取任何字节并被信号中断,因此可以重新启动它。 read()
poll()
撤销,并且POLLHUP
之后将无限期地返回read()
。此时,阅读器必须关闭其文件句柄并重新打开它。0
在阅读侧打开,则:O_RDWR
将不会被阻止。 open()
将提供poll()
清除。但是,对于命名管道,EOF不会导致POLLIN
或POLLIN
撤消。 POLLHUP
将一直阻塞,直到读取请求的字节数,被信号中断或发生其他严重的IO错误为止。对于命名管道,它将不会返回read()
,甚至不会在EOF上返回errno == EAGAIN
。它将一直坐在那里,直到读取了请求的确切字节数,或者直到接收到一个信号为止(在这种情况下,它将返回到目前为止已读取的字节数,或者如果没有读取到字节,则返回-1并设置0
)。 errno == EINTR
在阅读侧打开,则:O_RDWR | O_NONBLOCK
不会被阻止。 open()
将提供poll()
清除。但是,EOF不会导致命名管道上的POLLIN
或POLLIN
减少。 POLLHUP
将返回read()
并设置-1
。现在是时候返回errno == EAGAIN
以等待更多数据(可能来自其他流)的时候了。 poll()
不是标准的。
O_RDWR
,即使当一侧关闭时,该管道仍然存在,并且不会导致
POLLHUP
减少或返回
0
作为
read()
, 。
O_RDWR | O_NONBLOCK
,并且使用单个管道:poll()
open(pipe, O_RDONLY);
根据需要提供尽可能多的数据,可能会在read()
调用上循环。read()
和read() == -1
,则errno == EINTR
再次重新出现。 read()
,则连接已关闭,并且已接收所有数据。 read() == 0
,并期望管道(即使是命名管道)仅打开一次,并且一旦关闭,必须由读取器和写入器都重新打开,从而建立新的管道:poll()
open(pipe, O_RDONLY | O_NONBLOCK);
事件的poll()
,可能一次在多个管道上。 (注意:这可以防止POLLIN
在连接编写器之前获取多个EOF。)read()
根据需要提供尽可能多的数据,可能会在read()
调用上循环。read()
和read() == -1
,请返回errno == EAGAIN
步骤。 poll()
和read() == -1
,则errno == EINTR
再次重新出现。 read()
,则连接已关闭,您必须终止,或者关闭并重新打开管道。 read() == 0
,并期望命名管道永远不会终止,并且可以多次连接和断开连接:poll()
open(pipe, O_RDWR | O_NONBLOCK);
事件的poll()
,可能一次在多个管道上。 POLLIN
根据需要提供尽可能多的数据,可能会在read()
调用上循环。read()
和read() == -1
,请返回errno == EAGAIN
步骤。 poll()
和read() == -1
,则errno == EINTR
再次重新出现。 read()
,那是错误的-命名管道上的read() == 0
不应发生这种情况,而O_RDWR
或未命名的管道则不应发生这种情况。它表示已关闭的管道,必须将其关闭并重新打开。如果在同一个O_RDONLY
事件处理循环中混合了命名管道和未命名管道,则可能仍需要处理这种情况。 关于linux - 使用poll()在命名管道上使用O_RDWR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15055065/
我使用的是更新和升级的 ubuntu 14.0.4LTS。 我写了一个串口通信的代码。 #include #include #include #include #include
我创建了这个文件 char *output = "big"; creat(output, O_RDWR); 当我尝试读取文件时 cat big 我的权限被拒绝了。我的代码有什么问题?如何创建具有读写
我开始对 C 中的文件描述符感兴趣,我编写了以下代码: int main (void) { int fd1, fd2, sz; char *buf = "hello world !!!
我找不到关于如何锁定文件以进行读写的答案。 lock.l_type = F_WRLCK //for write. lock.l_type = F_RDLCK //for read lock.l_typ
在我的 C 代码中,我使用 open() 和选项 O_CREAT|O_RDWR 写入文件,然后是 write(): readfd = open("ak.bin", O_CREAT|O_RDWR
我想读取一个文件并更改其内容并将其写回文件。 我使用 open 读取文件如下: bfd = open(m_file_name.c_str(), O_RDWR) 但是当我写的时候,它有点像附加到旧的。我
我编写了一个从闪存 Nand(没有文件系统)读取数据的代码。 fd = open("/dev/mtd0", O_RDONLY) 它有效,然后我想尝试读写它..所以我将代码更改为: fd = open(
在我的简单程序中: #include #include #include #include using namespace std; int main(int argc, char *argv
使用函数 Open() 或 OpenFile(path, os.O_RDONLY) 后我可以读取文件,但之后无法删除文件。所以我尝试使用写标志 os.RDWR 打开文件,如下面的代码,看看我是否可以删
我想将触摸屏事件写入‘/dev/input/event1’,但它运行‘open("/dev/input/event1", O_RDWR);'权限被拒绝。我的手机已经 Root ,我用代码获得了根: S
我知道 open 提供了这些互斥的标志:O_RDONLY、O_WRONLY 和 O_RDWR。 我想知道:如果文件以 O_RDWR 和 打开,是否存在任何性能问题(即使只是几分之一毫秒)或处理文件的不
我正在尝试使用 打开一个临时文件 fd = open("/tmp", O_RDWR | O_TMPFILE, 0); if (fd == -1) { perror("open()");
我正在尝试注册为 Symfony 2 项目的新用户,我一直在努力。这是突然冒出来的。它昨天在办公室工作,我在家里设置了类似的设置。我得到了: Warning: session_start(): ope
当我将 index.php 文件更改为 index.html 文件然后再次更改回其原始 index.php 文件时出现此错误 谁能告诉我如何避免这个错误? Warning: session_start
我的应用程序有一个小问题。 首先我安装 i2c-tools 包, 我向所有用户授予 dev/i2c* 文件的所有权限。 之后,在 etc/modules 文件中添加行 i2c-dev i2c 设备存在
我正在尝试为结构构造函数编写单元测试,如果在 file.Open 期间发生错误,它也可能返回 nil。我不知道如何使用标志测试/模拟文件错误:os.O_RDWR|os.O_CREATE|os.O_AP
我正在将一些代码从 Win32 移植到使用锁定文件的 Linux。我用 open 为 Linux 做了一个实现,但我不确定如果文件在 Samba 共享上它是否会工作。我试过了,它似乎可以正常工作,但我
我是一名优秀的程序员,十分优秀!