我可以在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文件。是的,一个管道用于一个方向的数据,另一个管道用于另一个方向的命令(或信号)。