- 论坛徽章:
- 0
|
问题以前也遇到过,但一直没怎么弄清楚,这次在学习UNP V2的Posix消息队列时又碰到,不能忍了
要看的主要是mqnotifysignal.c,其余mqcreate.c和mqsend.c在测试时需要,我代码里用的是APUE的头文件,没有的可以把err_sys,err_quit替换成printf,编译时要加上 -lrt 这个链接库,之后可能还要挂载消息队列文件系统 mount -t mqueue none /mnt 。。。
代码如下:
- /* mqcreate.c */
- #include <apue.h>
- #include <mqueue.h>
- struct mq_attr attr;
- int main(int argc, char *argv[])
- {
- char c;
- int flags;
- mqd_t mqd;
- flags = O_RDWR | O_CREAT;
- while( (c = getopt(argc, argv, "em:z:")) != -1 )
- {
- switch ( c )
- {
- case 'e' :
- flags |= O_EXCL;
- break;
- case 'm' :
- attr.mq_maxmsg = atol(optarg);
- break;
- case 'z':
- attr.mq_msgsize = atol(optarg);
- break;
- default :
- break;
- }
- }
- if(optind != argc - 1)
- err_quit("usage: mqcreate [-e] [-m maxmsg -z msgsize] <name>");
- if( (attr.mq_maxmsg != 0 && attr.mq_msgsize == 0) ||
- (attr.mq_maxmsg == 0 && attr.mq_msgsize != 0))
- err_quit("must specify both -m maxmsg and -z msgsize");
- if( (mqd = mq_open(argv[optind], flags, FILE_MODE, (attr.mq_maxmsg != 0) ? &attr : NULL)) < 0 )
- err_sys("mq_open error");
- mq_close(mqd);
- exit(0);
- }
复制代码
- /* mqsend.c */
- #include <apue.h>
- #include <mqueue.h>
- int main(int argc, char *argv[])
- {
- mqd_t mqd;
- void *ptr;
- size_t len;
- unsigned int prio;
- if(argc != 4)
- err_quit("usage: mqsend <name> <#bytes> <priority>");
- len = atoi(argv[2]);
- prio = atoi(argv[3]);
- if( (mqd = mq_open(argv[1], O_WRONLY)) < 0 )
- err_sys("mq_open error");
- if( (ptr = calloc(len, sizeof(char))) == NULL )
- err_sys("calloc error");
- if(mq_send(mqd, ptr, len, prio) < 0)
- err_sys("mq_send error");
- exit(0);
- }
复制代码
- /* mqnotifysignal.c */
- #include <apue.h>
- #include <mqueue.h>
- mqd_t mqd;
- void *buff;
- struct mq_attr attr;
- struct sigevent sigev;
- static void sig_usr1(int);
- int main(int argc, char *argv[])
- {
- if(argc != 2)
- err_quit("usage: mqnotifysignal <name>");
- if( (mqd = mq_open(argv[1], O_RDONLY)) < 0 )
- err_sys("mq_open error");
- if( mq_getattr(mqd, &attr) < 0 )
- err_sys("mq_getattr error");
- if( (buff = malloc(attr.mq_msgsize)) == NULL )
- err_sys("malloc error");
- if( signal(SIGUSR1, sig_usr1) < 0 )
- err_sys("signal error");
- sigev.sigev_notify = SIGEV_SIGNAL;
- sigev.sigev_signo = SIGUSR1;
- if( mq_notify(mqd, &sigev) < 0 )
- err_sys("mq_notify error");
- while(1)
- pause();
- exit(0);
- }
- static void sig_usr1(int signo)
- {
- ssize_t n;
- if( mq_notify(mqd, &sigev) < 0 )
- err_sys("mq_notify error");
- if( (n = mq_receive(mqd, buff, attr.mq_msgsize, NULL)) < 0 )
- err_sys("mq_receive error");
- printf("SIGUSR1 received, read %ld bytes\n", (long)n);
- return;
- }
复制代码 测试结果是:
./mqcreate -m 10 -z 8192 /test
./mqnotifysignal /test1
现在在另一个控制台下:
./mqsend /test1 100 50 (正常,显示 “SIGUSR1 received, read 100 bytes”)
./mqsend /test1 100 50 (第二次就不正常了,显示 “User defined signal 1”)
现在如果把signal函数移动到while循环下,就可以正常每次都接收到消息,求解啊!- while(1)
- {
- if( signal(SIGUSR1, sig_usr1) < 0 )
- err_sys("signal error");
- pause();
- }
复制代码 |
|