怎么把消息通过sendint,const void func const*,size

Linux下消息队列学习笔记-linux-操作系统-壹聚教程网Linux下消息队列学习笔记
消息队列听起就是高大上的东西了,就像我们排队一样,在要实现是系统中的进程或服务进行排队操作了,下面一起来看看Linux下消息队列工作。
消息队列是进程间通讯的一种方法,一开始我以为消息队列是类似一个管道,一头连接一个进程、一头连接另一个进程,只能由这两个进程来进行互相的读写。其实这是错的,消息队列是系统层面的,它不属于某两个进程,它是由系统维护的一个链表结构。对消息队列的读写就是一个对链表的操作,默认是在链表的一端写数据,另一端读数据(先进先出),进程也可以取指定某种消息类型的消息。
在一个进程里创建了消息队列,且是可读可写的,那么系统中的所有进程都可以对它进行读写操作。
1、打开或创建一个消息队列
原型:int msgget(key_t key, int msgflg);
1)key :消息队列的key值。
2)msgflg:
IPC_CREAT:如果key对应的消息队列对象不存在,则创建;否则则进行打开操作,返回0。
IPC_EXCL:如果key对应的消息队列对象不存在,则返回-1;否则则进行打开操作,返回0。
权限控制:0666表示可读可写,和上面的IPC_CREAT做逻辑或操作。
成功返回,创建的或打开的消息队列的id。
失败返回-1。
例子程序:test1.c
# &sys/types.h&
#include &sys/ipc.h&
#include &sys/msg.h&
#include &stdio.h&
int main(void)
&printf(&this is test1!\n&);
&msgid = msgget(|IPC_CREAT);
&printf(&msgid = %d\n&, msgid);
&return 0;
执行结果:
[root@server ~]# gcc -o test1 test1.c
[root@server ~]# ./test1
this is test1!
msgid = 32768
[root@server ~]# ipcs
------ Shared Memory Segments --------
key&&&&&&& shmid&&&&& owner&&&&& perms&&&&& bytes&&&&& nattch&&&& status&&&&&
------ Semaphore Arrays --------
key&&&&&&& semid&&&&& owner&&&&& perms&&&&& nsems&&&&
0x&&&&&&&&& root&&&&&& 600&&&&&&& 1&&&&&&&&
------ Message Queues --------
key&&&&&&& msqid&&&&& owner&&&&& perms&&&&& used-bytes&& messages&&&
0x 32768&&&&& root&&&&&& 666&&&&&&& 0&&&&&&&&&&& 0&&&&&&&&
从ipcs命令的结果可以知道,消息队列在创建它的进程退出后,还存在于系统中,说明消息队列是系统一层的,并不是属于某个进程的。
2、设置消息队列属性(包括删除)
原型:int msgctl(int msqid, int cmd, struct msqid_ds *buf);
1)msqid:消息队列的id。
2)cmd:执行的控制命令。
IPC_STAT:读取消息队列属性。取得此队列的msqid_ds 结构,并将其存放在buf指向的结构中。
IPC_SET :设置消息队列属性。
IPC_RMID:删除消息队列。
IPC_INFO:读取消息队列基本情况。此命令等同于 ipcs 命令。
例子程序:test2.c
#include &sys/types.h&
#include &sys/ipc.h&
#include &sys/msg.h&
#include &stdio.h&
int main(void)
&printf(&this is test2!\n&);
&i = msgctl(32768, IPC_RMID, NULL);//这里已经知道消息id等于32768
&if (0 == i)
&&printf(&msq deleted!\n&);
&return 0;
执行结果:
[root@server ~]# gcc -o test2 test2.c
[root@server ~]# ./test2
this is test2!
msq deleted!
[root@server ~]# ipcs
------ Shared Memory Segments --------
key&&&&&&& shmid&&&&& owner&&&&& perms&&&&& bytes&&&&& nattch&&&& status&&&&&
------ Semaphore Arrays --------
key&&&&&&& semid&&&&& owner&&&&& perms&&&&& nsems&&&&
0x&&&&&&&&& root&&&&&& 600&&&&&&& 1&&&&&&&&
------ Message Queues --------
key&&&&&&& msqid&&&&& owner&&&&& perms&&&&& used-bytes&& messages
原有的消息队列被删除了。
3、向消息队列写/读消息
原型:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
原型:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
1)msqid:消息队列的id。
2)msgp:指向消息缓冲区的指针,该指针指向如下的一个用户可定义的通用结构。
struct mymsg {
& char mbuf[1024];
3)msgsz:消息的大小。
4)msgflg:可以为IPC_NOWAIT或0,表示操作是阻塞式的还是非阻塞式的。
设置为IPC_NOWAIT,在msgsnd()中,如果消息队列已经满了,则不会阻塞,立即返回-1(EAGAIN)。
在msgrcv()中,如果消息队列为空,则不做等待,立即返回-1(ENOMSG)。
设置为0,在msgsnd()中,进程阻塞直到(a)有空间可以容纳要发送的消息;或(b)从系统中删除了此队列(返回EIDRM);或(c)捕捉到一个信号,并从信号处理程序返回(返回EINTR)。
在msgrcv()中,进程阻塞直到(a)有了指定类型的消息;或(b)从系统中删除了此队列(返回EIDRM);或(c)捕捉到一个信号并从信号处理程序返回(返回EINTR)。
5)msgtype:用于msgrcv()函数,指定消息的类型。相当于区分消息类别的标志位。
msgtype = 0,返回消息队列中的第一个消息。
msgsnd(),成功返回0,出错返回-1。
msgrcv(),成功返回消息数据部分的长度,出错返回-1。
例子程序:test3.c
#include &sys/types.h&
#include &sys/ipc.h&
#include &sys/msg.h&
#include &stdio.h&
#include &errno.h&
typedef struct
&char mbuf[1024];
int main(void)
&int msgid1, msgid2;
&mymsg message1, message2, message3;
&printf(&this is test3!\n&);
&msgid1 = msgget(|IPC_CREAT);//key 1002
&if (msgid1 & 0)
&&printf(&create key=1002 error, errno=%d\n&, errno);
&&exit(-1);
&msgid2 = msgget(|IPC_CREAT);//key 1003
&if (msgid2 & 0)
&&printf(&create key=1003 error, errno=%d\n&, errno);
&&exit(-1);
&message1.mtype = 1;//设定一个消息类型
&memcpy(message1.mbuf, &first message&, 13);
&message3.mtype = 1;
&memcpy(message3.mbuf, &hello test4.&, 12);
&//test3进程在msgid1上发消息
&i = msgsnd(msgid1, (void *)&message1, strlen(message1.mbuf)+1, 0);
&if (i & 0)
&&printf(&send message1 error, errno=%d\n&, errno);
&&exit(-1);
&//test3进程从msgid1取消息,存到message2中
&i = msgrcv(msgid1, (void *)&message2, );
&if (i & 0)
&&printf(&rev error, errno=%d\n&, errno);
&&exit(-1);
&&//显示取出的消息
&&printf(&%s\n&, message2.mbuf);
&//test3进程在msgid2上发消息
&i = msgsnd(msgid2, (void *)&message3, strlen(message3.mbuf)+1, 0);
&if (i & 0)
&&printf(&send message3 error, errno=%d\n&, errno);
&&exit(-1);
&return 0;
例子程序:test4.c
#include &sys/types.h&
#include &sys/ipc.h&
#include &sys/msg.h&
#include &stdio.h&
#include &errno.h&
typedef struct
&char mbuf[1024];
int main(void)
&printf(&this is test4!\n&);
&i = msgget(|IPC_CREAT);
&if (i & 0)
&&printf(&create key=1003 error, errno=%d\n&, errno);
&&exit(-1);
&//test4进程在key=1003的消息队列上取消息
&j = msgrcv(i, (void *)&message, );
&if (j & 0)
&&printf(&rev error, errno=%d\n&, errno);
&&exit(-1);
&&//显示取出的消息
&&printf(&%s\n&, message.mbuf);
&return 0;
开两个终端,一个执行test3,另一个执行test4。
test3执行结果:
[root@server ~]# ./test3
this is test3!
first message
ipcs命令能看到key=1003的消息队列中有一条消息,使用了13字节长度。
key&&&&&&& msqid&&&&& owner&&&&& perms&&&&& used-bytes&& messages
0x000003ea 98305&&&&& root&&&&&& 666&&&&&&& 0&&&&&&&&&&& 0&&&&&&
0x000003eb 131074&&&& root&&&&&& 666&&&&&&& 13&&&&&&&&&& 1&&&&&&
test4执行结果:
[root@server ~]# ./test4
this is test4!
hello test4.
上一页: &&&&&下一页:相关内容您现在的位置:&&>>&&>>&&>>&&>>&正文
Linux网络编程函数
listen system call
& listen()监听套接字上的连接
&&&&&&& 1.int listen(int sockfd, int backlog) ;
&&&&&&& 2.被动监听的socket
&&&&&&& 3.需要在此前调用bind()函数,否则由系统指定一个随机的端口
&&&&&&& 4.成功返回0,失败返回-1。
&&& 连接队列
&&&&&&& 1.一个新的Client的连接请求先被放在连接队列中,等待Server程序调用accept函数接受连接请求
&&&&&&& 2.backlog指的就是接收队列的长度,亦即Server程序调用accept函数之前最大允许的连接请求数,多余的连接请求将被拒绝
accept system call
& accept()函数将响应连接请求,建立连接
&& 1.int accept(int sockfd,struct sockaddr * addr,int * addrlen);
&& 2.accept缺省是阻塞函数,阻塞直到有连接请求
&& 3.sockfd:被动(监听)的socket描述符
&& 4.如果成功,返回一个新的socket描述符(connected socket descriptor)来描述该连接。这个连接用来与特定的Client信息,原来的socket描述符继续保持非连接监听。如果失败则返回-1
&& 5.addr将在函数调用后被填入连接对方的地址信息,如对方的IP、端口等。
connect system call
&&& 客户端使用connect()函数连接到主机
&&&&&&& int connect(int sockfd, struct sockaddr * servaddr, int addrlen) ;
&&& 主动的socket
&&& servaddr是事先填写好的结构,Server的IP和端口都在该数据结构中指定。
&&& 通常connect将阻塞直到响应为止。
&&& 成功返回0,失败返回-1。
&&&&&& 面向连接的socket数据通讯
&&&&&&& && int send(int sockfd, const void * msg, size_t len, int flag ) ;
&&&&&&& && int recv(int sockfd, void * buf, size_t len, int flag ) ;
&&&&&& &&&&数据发送/接收函数,成功返回实际发送/接收的字节数,失败返回-1
&&& && 与write/read比较
&&&&&&& && ssize_t write(int fd, const void * buf, size_t count);
&&&&&&& && ssize_t read(int fd, void *buf, size_t count);
&&& && flag:
&&&&&&& && 1.send:MSG_OOB, MSG_DONTROUTE,MSG_DONTWAIT,MSG_NOSIGNAL, ...
&&& &&& && 2.recv:MSG_OOB, MSG_PEEK,MSG_WAITALL,MSG_NOSIGNAL,…
&&&&&& &&&&&&OOB(out-of-band),一般用于紧急特殊数据。
sendto/recvfrom
&&&&&& 面向数据报的socket通讯sendto/recvfrom
&&&&&&& int sendto(int sockfd, const void *msg, size_t len, int flags, const
&&&&&&&&&&& struct sockaddr *to, socketlen_t tolen) ;
&&&&&&& int recvfrom(int sockfd, void *buf, size_t len, int flags, struct
&&&&&&&&&&& sockaddr *from, socklen _t *fromlen);
close&shutdown
&&&&&&& close关闭套接字
&&&&&&& & 1.int close(int sockfd);
&&& &&& shutdown按指定方式关闭套接字
&&& &&&&& 1.int shutdown(int sockfd, int how);
&& &&&&&&&2.how:SHUT_RD,SHUT_WR,SHUT_RDWR
&&& &&& shutdown直接对TCP连接进行操作,close只是对套接字描述符操作。
getsockopt&setsockopt
&&&&&& 检查与修改套接字选项
&&& &&&& int getsockopt(int socket, int level, int optname,
&&&&&&&&&&&&&&&&&&&&&&&& void *optval, socklent *optlen-ptr)
&&& &&&& int setsockopt(int socket, int level, int optname,
&&&&&&&&&&&&&&&&&&&&&&&& void *optval, socklent optlen)
&&&&&& level为操作级别,当为普通socket级时,设为SOL_ SOCKET,否则设为操作控制选项对应的号,如TCP选项为IPPROTO_TCP,IP选项为IPPROTO_IP。
Host name and address conversions
&&& Files:
&&&&&&& 1./etc/resolv.conf, /etc/hosts
&&& Functions
&&&&&&& #include &netdb.h&
&&&&&&& struct hostent *gethostbyname(const char *name);
&&&&&&& struct hostent *gethostbyaddr(const char *addr, size_t len, int format);
&&& struct hostent
&&&&&&& struct hostent {
&&&&&&&&&&&& char *h_ &&/* official name of host */
&&&&&&&&&&&& char **h_& &/* alias list * /
&&&&&&&&&&&& int h_&&& &/* host address type, AF_INET/ AF _INET6 */
&&&&&&&&&&& int h_&&& &/* length of address */
&&& &&&&&&& char **h_addr_ /* list of addresses */
&&&& &&&&};
【责编:cc】
?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]
相关产品和培训
 友情推荐链接
 专题推荐
 ? ? ? ? ? ? ? ? ? ?
 今日更新
?&?&?&?&?&?&?&?&?&?&
 认证培训
 频道精选
 Windows频道导航
                      消息队列_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
上传于||文档简介
&&l​i​n​u​x
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩7页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 const void 转 char 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信