- 论坛徽章:
- 0
|
毕业设计做的是基于消息队列的进程间通信,由于要把进程的ID号发送到消息队列中,下面是代码
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<stdio.h>
4 #include<stdlib.h>
5 #include<string.h>
6 #include<fcntl.h>
7 #include<sys/ipc.h>
8 #include<sys/msg.h>
9 #include<sys/stat.h>
10 #include<unistd.h>
11 #define BUF_SIZE 256
12 #define PROJ_ID 32
13 #define PATH_NAME "/home"
14
15
16 int main(void)
17 {
18 /*用户自定义消息缓冲区*/
19 struct msgbuffer{
20 long msgtype;
21 char msgtext[BUF_SIZE];
22 }msgbuf;
23
24 char p[50];
25 pid_t pr,pc;
26 key_t msgkey;
27 int msgid; /*消息队列标志*/
28 int msglen;
29
30 /*调用fork函数,其返回值为pr*/
31 pr=fork();
32 /*通过pr的值来判断fork函数的返回情况,首先进行出错处理*/
33 if(pr==-1){
34 perror("fork");
35 exit(1);
36 }
37 else if(pr==0)
38 {
39 pc=getpid();
40 printf("%d\n",getpid());
41 sprintf(p,"%d",pc);
42 printf("%s\n",p);
43
44 /*获取键值*/
45 if((msgkey=ftok(PATH_NAME,PROJ_ID))==-1){
46 perror("ftok error!\n");
47 exit(1);
48 }
49 /*创建消息队列*/
50 if((msgid=msgget(msgkey,IPC_CREAT|0660))==-1){
51 perror("msgget error!\n");
52 exit(1);
53 }
54
55
56 while(1)
57 {
58 msgbuf.msgtype=2;
59 msglen=sizeof(struct msgbuffer)-4;
60 strcpy(msgbuf.msgtext,p);
61 if(msgsnd(msgid,&msgbuf,msglen,IPC_NOWAIT)==-1)
62 {
63 perror("msgsnd error\n");
64 exit(1);
65 }
66
67 }
68 /*if(msgctl(msgid,IPC_RMID,NULL)==-1)
69 {
70 perror("delete msg error!\n");
71 exit(1);
72 }*/
73 }
74 else exit(0);
75 }
76
刚开始的时候程序运行成功,后来运行了几次或者是几十次吧(具体忘记了)
再运行程序的结果是:
6942
6942
msgsnd error
: Resource temporarily unavailable
ipcs 查看:消息队列中的消息是64
然后将原来的消息队列删除,如代码68-72,此时ipcs查看没有消息队列
重新运行程序,出现了相同key、不同msgid的消息队列,可是消息队列中还是64条消息。
然后我又删除了消息队列,把消息队列的名字改变了一下,然后fotk函数中的path也改变了
重新运行程序,出现了不同key、不同msgid的消息队列,可是消息队列中还是64条消息。
到底是怎么回事呢??z这个问题困扰我很久了。。。。
大家帮忙指导一下,万分感谢!!
[ 本帖最后由 cyg19860205 于 2009-4-13 17:20 编辑 ] |
|