使用msgget()系统调用后创建一个无法使用cout或printf的msgQ。
以下是我的代码尝试从消息队列中接收。 第28行的“printf”不打印任何内容。但是如果我再添加一个“cout”或“printf”语句(比如第29行),它的工作正常。请告诉我代码中的任何缺陷。
1 #include<sys/errno.h>
2 #include<sys/wait.h>
3 #include<sys/ipc.h>
4 #include<stdio.h>
5 #include<iostream.h>
6 #include<sys/msg.h>
7 #include<sys/types.h>
8
9 struct messgQ
10 {
11 char text[1024];
12 long int mtype;
13 };
14
15
16 int main()
17 {
18 struct messgQ R;
19
20 R.mtype=1;
21
22 int qid=0;
23 qid=msgget((key_t)1234,0766|IPC_CREAT);
24 cout<<"\n 1 MsgQ created with id ="<<qid;
25
26 if( qid > 0 )
27 {
28 printf("\n MsgQ created with id =%d",qid);
29 }
30
31 int rc=0,run=1;
32 while( run )
33 {
34 memset(R.text,0x00,sizeof(R.text));
35 msgrcv(qid,&R,sizeof(R.text),1,0);
36 cout<<"\n Recvd:"<<R.text;
37 if( !strncmp(R.text,"bye",3) )
38 {
39 cout<<"\n Exiting";
40 run=0;
41 }
42 }
43 rc=msgctl(qid,IPC_RMID,NULL);
44 if (rc < 0)
45 perror(strerror(errno));
46 }
答案 0 :(得分:0)
msgget文档说
返回值 如果成功,返回值将是消息队列标识符(非负整数),否则为-1,其中errno表示错误。
所以第26行的检查有缺陷,应该是:
if( qid >= 0 )
关于输出,当您打印到终端时,stdout通常是行缓冲的。这意味着在您编写换行符之前,实际上不会写出输出。所以不要用换行符开始你的行,而是以一行代替。
printf(" MsgQ created with id =%d\n",qid);
cout<<"Recvd:"<<R.text << '\n';
cout<<"Exiting\n";
或者,通过执行
强制冲洗cout.flush();
或者,如果您正在使用诸如printf之类的C stdio函数,请使用
进行冲洗fflush(stdout);