我正在尝试编写一个客户端和服务器,它们将使用 POSIX 消息队列交换数据。我试图通过查看我在互联网上看到的示例和类(class)的文档来做到这一点。但是,我被困住了。当我运行它时,出现“打开的文件太多”错误。这是我的代码:
客户:
int main( int argc, char *argv[]) {
//Open its queue, which is client queue
char cq_name[10];
sprintf( cq_name, "/cq%i", getpid());
printf( "Client Queue name: %s\n", cq_name);
mqd_t cq_id = mq_open( cq_name, O_CREAT | O_RDWR, 0666, NULL);
if( cq_id == -1) {
printf( "Error in cq: %s\n", strerror( errno));
return -1;
}
printf( "Name: %s\n", argv[1]);
//Connect to the server message queue
mqd_t sq_id = mq_open( argv[1], O_RDWR);
if( sq_id == -1) {
printf( "Error in sq: %s\n", strerror( errno));
return -1;
}
...
服务器:
int main( int argc, char *argv[]) {
//The server message queue
struct mq_attr attr;
attr.mq_flags = 0;
attr.mq_curmsgs = 0;
printf( "Name: %s\n", argv[1]);
mqd_t id = mq_open( argv[1], O_CREAT | O_RDWR, 0666, NULL);
//Check the message queue
if( id == -1) {
printf( "Error: %s\n", strerror(errno));
}
printf( "Check Point 1 - %i\n", id);
...
你能帮我找出问题所在吗?提前致谢..
最佳答案
这周我遇到了这个问题 - 我最多只能打开 10 个 mqs。
我的意图是使用 mqs 将事件通知传递给线程。在我的例子中,event_id 只是一个 int。通过在调用 mq_open 时指定非默认属性,如下所示:
char mq_name[128];
sprintf(mq_name, "%s.%d", MQ_NAME, nnid);
struct mq_attr attrib;
attrib.mq_flags = 0;
attrib.mq_maxmsg = 4;
attrib.mq_msgsize = sizeof(int);
attrib.mq_curmsgs = 0;
retval = mq = mq_open(mq_name, O_RDWR | O_CREAT | O_EXCL, 0644, &attrib);
在 mq_open() 失败之前,我现在最多可以打开 256 个 mq。
关于c - mq_open() - 打开的文件太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22081382/