Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59757
  • 博文数量: 17
  • 博客积分: 650
  • 博客等级: 上士
  • 技术积分: 192
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-23 13:47
文章分类
文章存档

2011年(1)

2010年(16)

我的朋友

分类: C/C++

2010-03-19 17:14:11



  1. /*msg.c*/  
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  9.   
  10. #define BUFSZ 512  
  11.   
  12. /*消息缓冲区*/  
  13. struct message  
  14. {  
  15.     long msg_type;          //消息标识符  
  16.     char msg_text[BUFSZ];   //消息,这个字段不但可以存储字符,还可以存储其他类型数据  
  17. };  
  18.   
  19. int main()  
  20. {  
  21.     int qid;  
  22.     /*IPC关键字*/  
  23.     key_t key;  
  24.     int len;  
  25.     struct message msg;  
  26.     /*产生IPC关键字,用当前目录*/  
  27.     if((key=ftok(".",'a'))==-1)  
  28.     {  
  29.         perror("ftok");  
  30.         exit(1);  
  31.     }  
  32.     /*创建一个新的消息队列,返回消息队列标识符*/  
  33.     if((qid=msgget(key,IPC_CREAT|0666))==-1)  
  34.     {  
  35.         perror("msgget");  
  36.         exit(1);  
  37.     }  
  38.     printf("opened queue %d\n",qid);  
  39.     puts("Please enter the message to queue:");  
  40.     /*用户输入消息,到msg.msg_text去*/  
  41.     if((fgets(msg.msg_text,BUFSZ,stdin))==NULL)  
  42.     {  
  43.         puts("no message");  
  44.         exit(1);  
  45.     }  
  46.     /*消息标识符*/  
  47.     msg.msg_type = getpid();  
  48.     len = strlen(msg.msg_text);  
  49.     /*发送消息*/  
  50.     if((msgsnd(qid,&msg,len,0))<0)  
  51.     {  
  52.         perror("message posted");  
  53.         exit(1);  
  54.     }  
  55.     /*从消息队列读出消息,到msg*/  
  56.     if(msgrcv(qid,&msg,BUFSZ,0,0)<0)  
  57.     {  
  58.         perror("msgrcv");  
  59.         exit(1);  
  60.     }  
  61.     printf("message is:%s\n",(&msg)->msg_text);  
  62.     /*消息队列控制,这里删除消息队列*/  
  63.     if((msgctl(qid,IPC_RMID,NULL))<0)  
  64.     {  
  65.         perror("msgctl");  
  66.         exit(1);  
  67.     }  
  68.     exit(0);  
程序说明:
1、此程序是自己往消息队列中发送一个消息后,又自己读取的过程。
2、perror函数说明:
perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 错误 (stderr) 。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。
  在库函数中有个error变量,每个error值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了error的值。perror函数只是将你输入的一些信息和现在的error所对应的错误一起输出。
例如:上述程序中“ perror("msgctl");  ”若执行时,结果就为msgctl:error信息。
阅读(1155) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~