我的代码很简单:
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连接),可以回答这个问题吗?
答案 0 :(得分:0)
根据手册页,ENOSPC
是错误:
必须创建一个消息队列,但会超出最大消息队列数(MSGMNI)的系统限制。
如果它是服务器,则意味着其他用户创建的消息队列太多(如果这是一些家庭作业,并且其他学生也在服务器上工作,则不太可能)。您可以使用cat /proc/sys/kernel/msgmni
查看MSGMNI值。但是只有管理员可以更改它。