#include "unpipc.h"
#include "mqueue.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;
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
没有合适的资源?快使用搜索试试~ 我知道了~
UNIX网络编程-第2卷 程间通信 源代码
共445个文件
c:329个
makefile:40个
h:23个
5星 · 超过95%的资源 需积分: 9 25 下载量 134 浏览量
2011-10-19
00:01:01
上传
评论
收藏 332KB ZIP 举报
温馨提示
进程间通信(IPC)几乎是所有Unix程序性能的关键,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。本书从对Posix IPC和System V IPC的内部结构开始讨论,全面深入地介绍了4种IPC形式:消息传递(管道、FIFO、消息队列)、同步(互斥锁、条件变量、读写锁、文件与记录锁、信号量)、共享内存(匿名共享内存、具名共享内存)及远程过程调用(Solaris门、Sun RPC)
资源推荐
资源详情
资源评论
收起资源包目录
UNIX网络编程-第2卷 程间通信 源代码 (445个子文件)
graph.1 219B
graph.2 465B
Mail.todo.bobf 3KB
testmq.c 17KB
test1.c 17KB
wrapunix.c 14KB
wrappthread.c 6KB
mq_open.c 5KB
limits.c 5KB
sem_open.c 4KB
sem_open.c 3KB
prodcons4.c 3KB
mymq_receive.c 3KB
mq_send.c 3KB
prodcons1.c 2KB
error.c 2KB
prodcons7.c 2KB
bw_door.c 2KB
deadlock.c 2KB
test1.c 2KB
test1.c 2KB
prodcons3.c 2KB
locksvsemrace1.c 2KB
prodcons6.c 2KB
tserver1.c 2KB
sem_open.c 2KB
mycat2.c 2KB
prodcons1.c 2KB
incr_rwlock5.c 2KB
testsem.c 2KB
mq_receive.c 2KB
prodcons1.c 2KB
prodcons1.c 2KB
prodcons5.c 2KB
prodcons4.c 2KB
prodcons3.c 2KB
incr_rwlock2.c 2KB
server6.c 2KB
test1.c 2KB
incr_svsem6.c 2KB
incr_svsem5.c 2KB
prodcons2.c 2KB
incr_pxsem8.c 2KB
incr_pxsem7.c 2KB
incr_rwlock1.c 2KB
limits.c 2KB
prodcons2.c 2KB
incr_pxmutex5.c 2KB
incr_svsem2.c 2KB
bw_pxmsg.c 2KB
incr_svsem1.c 2KB
incr_fcntl1.c 2KB
limits.c 2KB
incr_fcntl5.c 2KB
incr_pxsem9.c 2KB
mainserver.c 1KB
svmsgread.c 1KB
incr_pxsem6.c 1KB
prodcons1.c 1KB
server2.c 1KB
bw_svmsg.c 1KB
server.c 1KB
server7.c 1KB
test2.c 1KB
read.c 1KB
testcancel.c 1KB
incr_pxsem2.c 1KB
mqnotifysig3.c 1KB
incr_pxsem5.c 1KB
testcancel.c 1KB
incr_rwlock1.c 1KB
bw_pipe.c 1KB
test1.c 1KB
lat_pxmsg.c 1KB
lat_door.c 1KB
incr_pxmutex0.c 1KB
server.c 1KB
clientfd1.c 1KB
write.c 1KB
mqnotifysig2.c 1KB
incr_pxmutex1.c 1KB
incr_pxsem1.c 1KB
locksvsem.c 1KB
clientintr3.c 1KB
mqnotifysig5.c 1KB
test3.c 1KB
wrapdoor.c 1KB
readline.c 1KB
client2.c 1KB
pthread_rwlock_rdlock.c 1KB
mq_setattr.c 1KB
mq_notify.c 1KB
mainclient.c 1KB
timing.c 1KB
test4.c 1KB
test3.c 1KB
test2.c 1KB
lat_sigqueue.c 1KB
client7.c 1KB
incr3.c 1KB
共 445 条
- 1
- 2
- 3
- 4
- 5
资源评论
- jacky_sysu2012-11-23代码可用,卷2第二版,谢谢楼主分享!
EvilTernary
- 粉丝: 6
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功