在msgget()之后,cout或printf无效

时间:2014-11-28 13:23:02

标签: c++

使用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 }

1 个答案:

答案 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);