我可以在C中锁定和解锁fifo(命名管道)吗?
我有两个进度,我可以在C中锁定和解锁fifo(命名管道)吗?,c,pipe,nonblocking,C,Pipe,Nonblocking,我有两个进度,p1和p2,两个进度之间的ipc有一个命名管道var。 当p1写入时,我想为p2锁定var的rw,并在p1完成写入时解锁var。 附言: 我使用select进行非阻塞,因此当p1将任何内容放入var时,p2将变得可读。我可以让var在p1完成写入时变得可读吗?您可以使用信号(例如SIGUSR1)。writer使其成为管道非阻塞(因此当管道变满时它不会阻塞),写入直到它不能再写入为止,然后将信号发送到另一个进程。读取进程(从其非阻塞管道)读取所有数据,然后向编写器发送信号,编写器随后
p1
和p2
,两个进度之间的ipc有一个命名管道var
。当
p1
写入时,我想为p2
锁定var
的rw,并在p1
完成写入时解锁var
。附言:
我使用select进行非阻塞,因此当
p1
将任何内容放入var
时,p2
将变得可读。我可以让var
在p1
完成写入时变得可读吗?您可以使用信号(例如SIGUSR1
)。writer使其成为管道非阻塞(因此当管道变满时它不会阻塞),写入直到它不能再写入为止,然后将信号发送到另一个进程。读取进程(从其非阻塞管道)读取所有数据,然后向编写器发送信号,编写器随后继续写入
然而,这确实是不必要的。作者只会写,读者只会读。如果管道已满,写入程序将阻塞,直到可以写入更多。对于读卡器也是一样,如果没有什么可读的,它就会阻塞。然后,当写入程序写入所有数据时,它将简单地关闭其管道末端,读取器将通过返回零字节读取的read
调用检测该末端。您可以使用信号(例如SIGUSR1
)。writer使其成为管道非阻塞(因此当管道变满时它不会阻塞),写入直到它不能再写入为止,然后将信号发送到另一个进程。读取进程(从其非阻塞管道)读取所有数据,然后向编写器发送信号,编写器随后继续写入
然而,这确实是不必要的。作者只会写,读者只会读。如果管道已满,写入程序将阻塞,直到可以写入更多。对于读卡器也是一样,如果没有什么可读的,它就会阻塞。然后,当编写器写入所有数据时,它只需关闭管道的末端,读取器将通过返回零字节读取的
read
调用检测到该末端。您是否尝试过表达您的想法并提出一些设计?在POSIX系统(如Linux和OSX)上,命名管道是文件系统中的文件,并且可以锁定文件。虽然我不知道他们是否会为管道工作。你试过搜索文件锁定函数吗?现在我有大量的数据,我需要将其写入管道。但是另一个进程应该在所有数据都已写入之前不读取它,我使用select进行非阻塞,并且p2
将在p1
将任何内容放入管道时标识管道是可读的,尽管它没有完全写入整个数据。记住管道不是无限的,它会填充并阻止编写应用程序。您是否尝试过表达您的想法并提出一些设计方案?在POSIX系统(如Linux和OSX)上,命名管道是文件系统中的文件,并且文件可以锁定。虽然我不知道他们是否会为管道工作。你试过搜索文件锁定函数吗?现在我有大量的数据,我需要将其写入管道。但是另一个进程应该在所有数据都已写入之前不读取它,我使用select进行非阻塞,并且p2
将在p1
将任何内容放入管道时标识管道是可读的,尽管它没有完全写入整个数据。记住管道不是无限的,它可以填充和阻止写入应用程序。文件锁给我一些感觉。稍后我将测试fcntl。我想我需要使用两个管道,一个用于信号,另一个用于数据。我只是想锁,但锁不上。可能无法锁定mkfifo的文件?@KaMeTang我怀疑无法锁定FIFO文件。是的,一个管道用于一个方向的数据,另一个管道用于另一个方向的命令(或信号)。稍后我将测试fcntl。我想我需要使用两个管道,一个用于信号,另一个用于数据。我只是想锁,但锁不上。可能无法锁定mkfifo的文件?@KaMeTang我怀疑无法锁定FIFO文件。是的,一个管道用于一个方向的数据,另一个管道用于另一个方向的命令(或信号)。