LINUX msgget和队列

时间:2014-04-15 21:23:30

标签: linux memory

我的代码很简单:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <errno.h>
  4 #include <string.h>
  5 #include <sys/types.h>
  6 #include <sys/ipc.h>
  7 #include <sys/msg.h>
  8
  9 struct my_msgbuf {
 10     long mtype;
 11     char mtext[200];
 12 };
 13
 14 int main(void){
 15     struct my_msgbuf buf;
 16     int msqid;
 17     key_t key;
 18
 19     if((key = ftok("main.c", 'B')) == -1) {
 20         perror("ftok"); exit(1);
 21     }
 22
 23     if( (msqid = msgget(key, 0644 | IPC_CREAT)) == -1){
 24         perror("msgget");
 25         exit(1);
 26     }
 27
 28     printf("Enter lines of text, ^D to quit:\n");
 29     buf.mtype = 1;
 30     while(fgets(buf.mtext, sizeof(buf.mtext), stdin) != NULL){
 31         int len = strlen(buf.mtext);
 32         if(buf.mtext[len-1] == '\n') buf.mtext[len-1] = '\0';
 33         if(msgsnd(msqid, &buf, len+1,0) == -1){
 34             perror("msgsnd");
 35         }
 36
 37     }
 38
 39     if(msgctl(msqid, IPC_RMID, NULL) == -1){
 40         perror("msgctl");
 41         exit(1);
 42     }
 43
 44  return 0;
 45 }

下一步我做的事情:

gcc -o main main.c

下一步运行:

./main

和结果:

msgget:设备上没有剩余空间

我该怎么修呢?我在大学服务器上工作(通过putty连接),可以回答这个问题吗?

1 个答案:

答案 0 :(得分:0)

根据手册页,ENOSPC是错误:

  

必须创建一个消息队列,但会超出最大消息队列数(MSGMNI)的系统限制。

如果它是服务器,则意味着其他用户创建的消息队列太多(如果这是一些家庭作业,并且其他学生也在服务器上工作,则不太可能)。您可以使用cat /proc/sys/kernel/msgmni查看MSGMNI值。但是只有管理员可以更改它。