📄 test1.c
字号:
#include "unpipc.h"
#define BUFFLEN 100
char msg[BUFFLEN]; /* receive buffer */
char msg0[] = "";
char msg1[] = "1";
char msg2[] = "22";
char msg3[] = "333";
char msg4[] = "4444";
char msg5[] = "55555";
char msg6[] = "666666";
char msg7[] = "7777777";
char msg8[] = "88888888";
static void sig_alrm(int);
static void sig_usr1(int);
int blocked, sigusr1;
int
main(int argc, char **argv)
{
int rc;
pid_t childpid;
mqd_t mqd;
unsigned int prio;
struct sigevent sigev;
struct mq_attr attr, info;
if (argc != 2)
err_quit("usage: testmymq <name>");
/***************************************************************/
/* test mq_unlink() error return */
mq_unlink(argv[1]);
if ( ( rc = mq_unlink(argv[1])) == 0 || errno != ENOENT)
err_sys("mq_unlink returned %d", rc);
/***************************************************************/
/* create a queue with default attributes */
mqd = Mq_open(argv[1], O_CREAT | O_EXCL | O_RDWR, FILE_MODE, NULL);
Mq_getattr(mqd, &info);
if (info.mq_maxmsg != 128 || info.mq_msgsize != 1024 ||
info.mq_flags != 0 || info.mq_curmsgs != 0)
err_msg("message queue defaults:\n"
"maxmsg = %ld, msgsize = %ld, flags = %ld, curmsgs = %ld",
info.mq_maxmsg, info.mq_msgsize,
info.mq_flags, info.mq_curmsgs);
Mq_close(mqd);
/***************************************************************/
/* check O_EXCL */
mqd = mq_open(argv[1], O_CREAT | O_EXCL | O_RDWR, FILE_MODE, NULL);
if (mqd != (mqd_t) -1 || errno != EEXIST)
err_sys("mq_open returned %d", rc);
Mq_unlink(argv[1]);
/***************************************************************/
/* create with attributes */
attr.mq_maxmsg = 4;
attr.mq_msgsize = 7;
mqd = Mq_open(argv[1], O_CREAT | O_EXCL | O_RDWR, FILE_MODE, &attr);
Mq_getattr(mqd, &info);
if (info.mq_maxmsg != 4 || info.mq_msgsize != 7 ||
info.mq_flags != 0 || info.mq_curmsgs != 0)
err_quit("1: maxmsg = %ld, msgsize = %ld, flags = %ld, curmsgs = %ld\n",
info.mq_maxmsg, info.mq_msgsize,
info.mq_flags, info.mq_curmsgs);
/***************************************************************/
/* send/receive 1 message */
Mq_send(mqd, msg1, 1, 1);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 1)
err_quit("mq_receive returned %d, expected 1", rc);
if (prio != 1)
err_quit("mq_receive returned prio %d, expected 1", prio);
/* send/receive 1 0-byte message */
Mq_send(mqd, msg0, 0, 0);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 0)
err_quit("mq_receive returned %d, expected 0", rc);
if (prio != 0)
err_quit("mq_receive returned prio %d, expected 0", prio);
/* send 2 messages/receive in reverse order */
Mq_send(mqd, msg1, 1, 1);
Mq_send(mqd, msg2, 2, 2);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 2)
err_quit("mq_receive returned %d, expected 2", rc);
if (prio != 2)
err_quit("mq_receive returned prio %d, expected 2", prio);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 1)
err_quit("mq_receive returned %d, expected 1", rc);
if (prio != 1)
err_quit("mq_receive returned prio %d, expected 1", prio);
/* send 3 messages/receive in reverse order */
Mq_send(mqd, msg1, 1, 1);
Mq_send(mqd, msg2, 2, 2);
Mq_send(mqd, msg3, 3, 3);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 3)
err_quit("mq_receive returned %d, expected 3", rc);
if (prio != 3)
err_quit("mq_receive returned prio %d, expected 3", prio);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 2)
err_quit("mq_receive returned %d, expected 2", rc);
if (prio != 2)
err_quit("mq_receive returned prio %d, expected 2", prio);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 1)
err_quit("mq_receive returned %d, expected 1", rc);
if (prio != 1)
err_quit("mq_receive returned prio %d, expected 1", prio);
/* send 4 messages/receive in reverse order */
Mq_send(mqd, msg1, 1, 1);
Mq_send(mqd, msg2, 2, 2);
Mq_send(mqd, msg3, 3, 3);
Mq_send(mqd, msg4, 4, 4);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 4)
err_quit("mq_receive returned %d, expected 4", rc);
if (prio != 4)
err_quit("mq_receive returned prio %d, expected 4", prio);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 3)
err_quit("mq_receive returned %d, expected 3", rc);
if (prio != 3)
err_quit("mq_receive returned prio %d, expected 3", prio);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 2)
err_quit("mq_receive returned %d, expected 2", rc);
if (prio != 2)
err_quit("mq_receive returned prio %d, expected 2", prio);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 1)
err_quit("mq_receive returned %d, expected 1", rc);
if (prio != 1)
err_quit("mq_receive returned prio %d, expected 1", prio);
/***************************************************************/
/* send/receive 1 message */
Mq_send(mqd, msg4, 4, 4);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 4)
err_quit("mq_receive returned %d, expected 4", rc);
if (prio != 4)
err_quit("mq_receive returned prio %d, expected 4", prio);
/* send 2 messages/receive in order */
Mq_send(mqd, msg4, 4, 4);
Mq_send(mqd, msg3, 3, 3);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 4)
err_quit("mq_receive returned %d, expected 4", rc);
if (prio != 4)
err_quit("mq_receive returned prio %d, expected 4", prio);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 3)
err_quit("mq_receive returned %d, expected 3", rc);
if (prio != 3)
err_quit("mq_receive returned prio %d, expected 3", prio);
/* send 3 messages/receive in order */
Mq_send(mqd, msg4, 4, 4);
Mq_send(mqd, msg3, 3, 3);
Mq_send(mqd, msg2, 2, 2);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 4)
err_quit("mq_receive returned %d, expected 4", rc);
if (prio != 4)
err_quit("mq_receive returned prio %d, expected 4", prio);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 3)
err_quit("mq_receive returned %d, expected 3", rc);
if (prio != 3)
err_quit("mq_receive returned prio %d, expected 3", prio);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 2)
err_quit("mq_receive returned %d, expected 2", rc);
if (prio != 2)
err_quit("mq_receive returned prio %d, expected 2", prio);
/* send 4 messages/receive in order */
/* first check EMSGSIZE */
if ( (rc = mq_send(mqd, msg4, 8, 4)) == 0 || errno != EMSGSIZE)
err_sys("mq_send returned %d, expected EMSGSIZE", rc);
Mq_send(mqd, msg4, 4, 4);
Mq_send(mqd, msg3, 3, 3);
Mq_send(mqd, msg2, 2, 2);
Mq_send(mqd, msg1, 1, 1);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 4)
err_quit("mq_receive returned %d, expected 4", rc);
if (prio != 4)
err_quit("mq_receive returned prio %d, expected 4", prio);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 3)
err_quit("mq_receive returned %d, expected 3", rc);
if (prio != 3)
err_quit("mq_receive returned prio %d, expected 3", prio);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 2)
err_quit("mq_receive returned %d, expected 2", rc);
if (prio != 2)
err_quit("mq_receive returned prio %d, expected 2", prio);
/* first check EMSGSIZE */
if ( (rc = mq_receive(mqd, msg, 6, &prio)) == 0 || errno != EMSGSIZE)
err_sys("mq_receive returned %d, expected EMSGSIZE", rc);
if ( (rc = Mq_receive(mqd, msg, BUFFLEN, &prio)) != 1)
err_quit("mq_receive returned %d, expected 1", rc);
if (prio != 1)
err_quit("mq_receive returned prio %d, expected 1", prio);
/* fill queue then close it */
Mq_send(mqd, msg1, 1, 1);
Mq_send(mqd, msg2, 2, 2);
Mq_send(mqd, msg4, 4, 4);
Mq_send(mqd, msg3, 3, 3);
Mq_close(mqd);
/* open existing queue nonblocking and read */
mqd = Mq_open(argv[1], O_RDWR | O_NONBLOCK);
Mq_getattr(mqd, &info);
if (info.mq_maxmsg != 4 || info.mq_msgsize != 7 ||
info.mq_flags != O_NONBLOCK || info.mq_curmsgs != 4)
err_quit("2: maxmsg = %ld, msgsize = %ld, flags = %ld, curmsgs = %ld\n",
info.mq_maxmsg, info.mq_msgsize,
info.mq_flags, info.mq_curmsgs);
if ( (rc = Mq_receive(mqd, msg, info.mq_msgsize, &prio)) != 4)
err_quit("mq_receive returned %d, expected 4", rc);
if (prio != 4)
err_quit("mq_receive returned prio %d, expected 4", prio);
if ( (rc = Mq_receive(mqd, msg, info.mq_msgsize, &prio)) != 3)
err_quit("mq_receive returned %d, expected 3", rc);
if (prio != 3)
err_quit("mq_receive returned prio %d, expected 3", prio);
if ( (rc = Mq_receive(mqd, msg, info.mq_msgsize, &prio)) != 2)
err_quit("mq_receive returned %d, expected 2", rc);
if (prio != 2)
err_quit("mq_receive returned prio %d, expected 2", prio);
if ( (rc = Mq_receive(mqd, msg, info.mq_msgsize, &prio)) != 1)
err_quit("mq_receive returned %d, expected 1", rc);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -