用O_WRONLY挂在open()上的C ++ Linux命名pipe道

这是我简单的代码,打开一个命名pipe道,写一个string,然后closurespipe道。 pipe道是在另一个函数中创build的,如下所述。

char * ipcnm = "./jobqueue"; std::cout << "opening job queue" << std::endl; //ensure the jobqueue is opened if ((jobq = open(ipcnm, O_WRONLY)) < 0) { perror("open"); exit(-1); } std::cout << "queue opened" << std::endl; // record the number of bytes written to the queue size_t written = write(jobq, ptr, size*nmemb); // close fifo if (close(jobq) < 0) { perror("close"); exit(-1); } // need to report to other agents the size of the job that was written jobSizes.push_back(written); 

但打开()的呼叫挂起。 我已经确定在调用时没有使用fifo“jobqueue”的其他进程,并且一旦创build它,​​队列的文件权限设置为prwxrwxr-x(我只是使用mkfifo(ipcnm, 0777)创buildpipe道。

我一开始以为这是一个问题,那个组在这个pipe道上缺less权限,所以我用chmod手动改变它们,它仍然挂起,因为“队列打开”永远不会被打印。 perror错误信息(“open”);

我错过了什么?

Solutions Collecting From Web of "用O_WRONLY挂在open()上的C ++ Linux命名pipe道"

当你打开一个FIFO写入时,作者被阻塞,直到有一个阅读器。

你可能错过了读者。

您不能写入管道,然后关闭它,然后让读者稍后再来。 这种存储语义是通过使用常规文件来完成的。

管道是一个进程间通信机制; 通过打开FIFO创建的pipepipe POSIX C库函数返回的对象类似,不同之处在于pipe返回已经为I / O准备好的对象,因为有两个描述符:相反的两端为I的相反方向打开/ O。 FIFO的端点是一次单独打开的。

文件系统中的FIFO对象只是一个允许多个进程连接到相同管道的接触点。

最初,不存在管道对象。 当第一个进程在文件系统的FIFO对象上执行open时,会创建一个管道。 来自同一进程或另一个进程的任何额外的open请求将附加到内核中保存的相同管道对象。 只有在打开管道至少一次读取和至少一次写入时才能进行I / O。 实际的管道I / O通过内核; 它不存储在文件系统中。 当所有进程关闭管道时,对象都会消失。

FIFO可以被设计成使得I / O可以在任何进程打开对象读取之前开始。 也就是说,一个写请求可以被允许继续,然后只在管道填满时才被阻塞。 那个设计会有问题。 例如,如果写小,那么管道不填满呢? 作者将写入数据并继续执行。 如果只是在读者读取数据之前退出,数据就永远消失了! 阻止行为确保读者在那里捕捉数据; 当作者畅通无阻时,读者可以确认管道已经打开,因此可以安全地关闭管道的末端而不会丢失数据。 即使没有可用的读写器,也不会阻塞写入的设计,即使在没有进程打开的情况下,也必须将管道对象保持在内核之内,以便写入者可以打开管道,将数据放入管道中,然后离开,后来读者可以拿起数据。 否则,设计人员必须向编写者提供一个阻塞close (类似于SO_LINGER套接字上的行为),等待先前写入的数据被删除。