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

📄 testmq.c

📁 《UNIX进程间通信》中的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (prio != 1)		err_quit("mq_receive returned prio %d, expected 1", prio);		/* check nonblockiing receive */	if ( (rc = mymq_receive(mqd, msg, info.mq_msgsize, &prio)) == 0 ||		errno != EAGAIN)		err_sys("mq_receive returned %d, expected EAGAIN", rc);		/* fill queue then close it */	Mymq_send(mqd, msg1, 1, 1);	Mymq_send(mqd, msg4, 4, 4);	Mymq_send(mqd, msg2, 2, 2);	Mymq_send(mqd, msg3, 3, 3);		/* first check nonblocking send */	if ( (rc = mymq_send(mqd, msg5, 5, 5)) == 0 || errno != EAGAIN)		err_sys("mq_send returned %d, expected EAGAIN", rc);	Mymq_close(mqd);		/* open existing queue and read */	mqd = Mymq_open(argv[1], O_RDWR);	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);		/* now set nonblocking with mq_setattr */	attr.mq_flags = O_NONBLOCK;	Mymq_setattr(mqd, &attr, &info);	if (info.mq_maxmsg != 4 || info.mq_msgsize != 7 ||		info.mq_flags != 0 || info.mq_curmsgs != 3)		err_quit("3: maxmsg = %ld, msgsize = %ld, flags = %ld, curmsgs = %ld\n",		   		 info.mq_maxmsg, info.mq_msgsize,				 info.mq_flags, info.mq_curmsgs);	Mymq_getattr(mqd, &info);	if (info.mq_maxmsg != 4 || info.mq_msgsize != 7 ||		info.mq_flags != O_NONBLOCK || info.mq_curmsgs != 3)		err_quit("4: 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)) != 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);	if (prio != 1)		err_quit("mq_receive returned prio %d, expected 1", prio);		/* check nonblocking receive */	if ( (rc = mymq_receive(mqd, msg, info.mq_msgsize, &prio)) == 0 ||		errno != EAGAIN)		err_sys("mq_receive returned %d, expected EAGAIN", rc);		/* now clear nonblocking with mq_setattr */	attr.mq_flags = 0;	Mymq_setattr(mqd, &attr, &info);	if (info.mq_maxmsg != 4 || info.mq_msgsize != 7 ||		info.mq_flags != O_NONBLOCK || info.mq_curmsgs != 0)		err_quit("5: maxmsg = %ld, msgsize = %ld, flags = %ld, curmsgs = %ld\n",		   		 info.mq_maxmsg, info.mq_msgsize,				 info.mq_flags, info.mq_curmsgs);	Mymq_getattr(mqd, &info);	if (info.mq_maxmsg != 4 || info.mq_msgsize != 7 ||		info.mq_flags != 0 || info.mq_curmsgs != 0)		err_quit("6: maxmsg = %ld, msgsize = %ld, flags = %ld, curmsgs = %ld\n",		   		 info.mq_maxmsg, info.mq_msgsize,				 info.mq_flags, info.mq_curmsgs);#ifdef	notdef		/* queue is empty; check that mymq_receive is interruptable */	Signal(SIGALRM, sig_alrm);	blocked = 1;	alarm(4);	if ( (rc = mymq_receive(mqd, msg, info.mq_msgsize, &prio)) == 0 ||		errno != EINTR)		err_sys("mq_receive returned %d, expected EINTR", rc);	alarm(0);	printf("mymq_receive interrupted, as expected\n");		/* fill queue */	Mymq_send(mqd, msg1, 1, 1);	Mymq_send(mqd, msg2, 2, 2);	Mymq_send(mqd, msg3, 3, 3);	Mymq_send(mqd, msg4, 4, 4);	Mymq_getattr(mqd, &info);	if (info.mq_maxmsg != 4 || info.mq_msgsize != 7 ||		info.mq_flags != 0 || info.mq_curmsgs != 4)		err_quit("7: maxmsg = %ld, msgsize = %ld, flags = %ld, curmsgs = %ld\n",		   		 info.mq_maxmsg, info.mq_msgsize,				 info.mq_flags, info.mq_curmsgs);		/* queue is full; check that mymq_send is interruptable */	Signal(SIGALRM, sig_alrm);	blocked = 1;	alarm(4);printf("about to call mymq_send\n");	if ( (rc = mymq_send(mqd, msg5, 5, 5)) == 0 || errno != EINTR)		err_sys("mq_send returned %d, expected EINTR", rc);	alarm(0);	printf("mymq_send interrupted, as expected\n");#endif		/* queue is empty, register for notification */	sigev.sigev_notify = SIGEV_SIGNAL;	sigev.sigev_signo = SIGUSR1;	Signal(SIGUSR1, sig_usr1);	Mymq_notify(mqd, &sigev);		/* verify we cannot register twice */	if ( (rc = mymq_notify(mqd, &sigev)) == 0 || errno != EBUSY)		err_sys("mq_notify returned %d, expected EBUSY", rc);		/* now unregister, then reregister */	Mymq_notify(mqd, NULL);	Mymq_notify(mqd, &sigev);		/* verify we cannot register twice */	if ( (rc = mymq_notify(mqd, &sigev)) == 0 || errno != EBUSY)		err_sys("mq_notify returned %d, expected EBUSY", rc);		/* make certain child cannot register if we are registered */	if ( (childpid = Fork()) == 0) {		if ( (rc = mymq_notify(mqd, &sigev)) == 0 || errno != EBUSY)			err_sys("mq_notify returned %d, expected EBUSY", rc);		exit(0);	}	Waitpid(childpid, NULL, 0);		/* send a message and verify SIGUSR1 is delivered */	sigusr1 = 0;	Mymq_send(mqd, msg5, 5, 5);	sleep(1);	if (sigusr1 != 1)		err_quit("sigusr1 = %d, expected 1", sigusr1);	if ( (rc = Mymq_receive(mqd, msg, info.mq_msgsize, &prio)) != 5)		err_quit("mq_receive returned %d, expected 5", rc);	if (prio != 5)		err_quit("mq_receive returned prio %d, expected 5", prio);		/* send another and make certain another signal is not sent */	Mymq_send(mqd, msg2, 2, 2);	sleep(1);	if (sigusr1 != 1)		err_quit("sigusr1 = %d, expected 1", sigusr1);	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);		/* reregister */	Mymq_notify(mqd, &sigev);	if ( (childpid = Fork()) == 0) {			/* child calls mq_receive, which prevents notification */		if ( (rc = Mymq_receive(mqd, msg, info.mq_msgsize, &prio)) != 6)			err_quit("mq_receive returned %d, expected 6", rc);		if (prio != 6)			err_quit("mq_receive returned prio %d, expected 6", prio);		exit(0);	}	sleep(2);		/* let child block in mq_receive() */	Mymq_send(mqd, msg6, 6, 6);	Waitpid(childpid, NULL, 0);	if (sigusr1 != 1)		err_quit("sigusr1 = %d, expected 1", sigusr1);		/* make certain parent can send messages to child, and vice versa */	if ( (childpid = Fork()) == 0) {		sleep(2);		/* let parent send two messages */		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)) != 1)			err_quit("mq_receive returned %d, expected 1", rc);		if (prio != 1)			err_quit("mq_receive returned prio %d, expected 1", prio);		exit(0);	}	Mymq_send(mqd, msg1, 1, 1);	Mymq_send(mqd, msg3, 3, 3);	Waitpid(childpid, NULL, 0);	Mymq_getattr(mqd, &info);	if (info.mq_maxmsg != 4 || info.mq_msgsize != 7 ||		info.mq_flags != 0 || info.mq_curmsgs != 0)		err_quit("8: maxmsg = %ld, msgsize = %ld, flags = %ld, curmsgs = %ld\n",		   		 info.mq_maxmsg, info.mq_msgsize,				 info.mq_flags, info.mq_curmsgs);	if ( (childpid = Fork()) == 0) {		Mymq_send(mqd, msg3, 3, 3);		Mymq_send(mqd, msg5, 5, 5);		Mymq_send(mqd, msg1, 1, 1);		exit(0);	}	sleep(2);		/* let child send 3 messages */	if ( (rc = Mymq_receive(mqd, msg, info.mq_msgsize, &prio)) != 5)		err_quit("mq_receive returned %d, expected 5", rc);	if (prio != 5)		err_quit("mq_receive returned prio %d, expected 5", 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)) != 1)		err_quit("mq_receive returned %d, expected 1", rc);	if (prio != 1)		err_quit("mq_receive returned prio %d, expected 1", prio);	Waitpid(childpid, NULL, 0);	Mymq_getattr(mqd, &info);	if (info.mq_maxmsg != 4 || info.mq_msgsize != 7 ||		info.mq_flags != 0 || info.mq_curmsgs != 0)		err_quit("9: maxmsg = %ld, msgsize = %ld, flags = %ld, curmsgs = %ld\n",		   		 info.mq_maxmsg, info.mq_msgsize,				 info.mq_flags, info.mq_curmsgs);	printf("done\n");	exit(0);}static voidsig_usr1(int signo){	sigusr1++;	return;}static voidsig_alrm(int signo){	printf("SIGALRM caught\n");	return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -