⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testmq.c

📁 让你了解Unix进程间的通信是如何实现的
💻 C
📖 第 1 页 / 共 2 页
字号:
#include	"unpipc.h"#include	"mqueue.h"#define	BUFFLEN		100char	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;intmain(int argc, char **argv){	int		rc;	pid_t	childpid;	mymqd_t	mqd;	unsigned int	prio;	struct sigevent	sigev;	struct mymq_attr	attr, info;	if (argc != 2)		err_quit("usage: testmymq <pathname>");		/***************************************************************/		/* test mq_unlink() error return */	mymq_unlink(argv[1]);	if ( ( rc = mymq_unlink(argv[1])) == 0 || errno != ENOENT)		err_sys("mq_unlink returned %d", rc);		/***************************************************************/		/* create a queue with default attributes */	mqd = Mymq_open(argv[1], O_CREAT | O_EXCL | O_RDWR, FILE_MODE, NULL);	Mymq_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);	Mymq_close(mqd);		/***************************************************************/		/* check O_EXCL */	mqd = mymq_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);	Mymq_unlink(argv[1]);		/***************************************************************/		/* create with attributes */	attr.mq_maxmsg = 4;	attr.mq_msgsize = 7;	mqd = Mymq_open(argv[1], O_CREAT | O_EXCL | O_RDWR, FILE_MODE, &attr);	Mymq_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 */	Mymq_send(mqd, msg1, 1, 1);	if ( (rc = Mymq_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 */	Mymq_send(mqd, msg0, 0, 0);	if ( (rc = Mymq_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 */	Mymq_send(mqd, msg1, 1, 1);	Mymq_send(mqd, msg2, 2, 2);	if ( (rc = Mymq_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 = Mymq_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 */	Mymq_send(mqd, msg1, 1, 1);	Mymq_send(mqd, msg2, 2, 2);	Mymq_send(mqd, msg3, 3, 3);	if ( (rc = Mymq_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 = Mymq_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 = Mymq_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 */	Mymq_send(mqd, msg1, 1, 1);	Mymq_send(mqd, msg2, 2, 2);	Mymq_send(mqd, msg3, 3, 3);	Mymq_send(mqd, msg4, 4, 4);	if ( (rc = Mymq_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 = Mymq_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 = Mymq_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 = Mymq_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 */	Mymq_send(mqd, msg4, 4, 4);	if ( (rc = Mymq_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 */	Mymq_send(mqd, msg4, 4, 4);	Mymq_send(mqd, msg3, 3, 3);	if ( (rc = Mymq_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 = Mymq_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 */	Mymq_send(mqd, msg4, 4, 4);	Mymq_send(mqd, msg3, 3, 3);	Mymq_send(mqd, msg2, 2, 2);	if ( (rc = Mymq_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 = Mymq_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 = Mymq_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 = mymq_send(mqd, msg4, 8, 4)) == 0 || errno != EMSGSIZE)		err_sys("mq_send returned %d, expected EMSGSIZE", rc);	Mymq_send(mqd, msg4, 4, 4);	Mymq_send(mqd, msg3, 3, 3);	Mymq_send(mqd, msg2, 2, 2);	Mymq_send(mqd, msg1, 1, 1);	if ( (rc = Mymq_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 = Mymq_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 = Mymq_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 = mymq_receive(mqd, msg, 6, &prio)) == 0 || errno != EMSGSIZE)		err_sys("mq_receive returned %d, expected EMSGSIZE", rc);	if ( (rc = Mymq_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 */	Mymq_send(mqd, msg1, 1, 1);	Mymq_send(mqd, msg2, 2, 2);	Mymq_send(mqd, msg4, 4, 4);	Mymq_send(mqd, msg3, 3, 3);	Mymq_close(mqd);		/* open existing queue nonblocking and read */	mqd = Mymq_open(argv[1], O_RDWR | O_NONBLOCK);	Mymq_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 = Mymq_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 = Mymq_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 = Mymq_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 = Mymq_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 + -