linux网络编程之posix消息队列】的更多相关文章

在前面已经学习了System v相关的IPC,今天起学习posix相关的IPC,关于这两者的内容区别,简单回顾一下: 而今天先学习posix的消息队列,下面开始: 接下来则编写程序来创建一个posix消息队列: 下面来编译运行一下: 这是为什么呢?其实在man帮助中有说明: 所以,修改一下Makefile文件,加上这个链接选项: 再来运行一下: posix消息队列创建成功了,下面来查看一下: 这是为什么呢?原因是由于ipcs只能查看System v创建的消息队列,而poix创建的消息队列不能通过…
继上次学习了posix线程之后,这次来讨论一下posix信号量与互斥锁相关的知识: 跟posix消息队列,共享内存的打开,关闭,删除操作一样,不过,上面的函数是对有名信号量进行操作,通过man帮助可以得知: 有名信号量相对的那就是无名信号量,对于它相关的函数如下: 同样可以查看man帮助: [思考]:是不是无名信号量就无法用于不同进程间的多个线程间进行通信呢?实际上不是这样的: 而对于信号量的P.V操作,可以用以下两个函数,既能用于有名,也能用于无名信号量: 初始化互斥锁: 锁定操作: 解锁操作…
今天来学习posix的最后一个相关知识----条件变量,言归正传. 下面用一个图来进一步描述条件变量的作用: 为什么呢? 这实际上可以解决生产者与消费者问题,而且对于缓冲区是无界的是一种比较理解的解决方案,只有有产品时才通知消费者开始消费产品,生产者不关心缓存区是否满,后面会用条件变量与互斥锁来解决生产者与消费者问题. 下面则根据上面的使用规范来解决生产者与消费者问题: [说明]:这里并没有用到缓冲区,而是只要发现条件不满足则等待,直接条件满足才消费,所以实现了一个无界的缓冲区,另外nready…
今天继续学习posix IPC相关的东东,消息队列和共享内存已经学习过,接下来学习线程相关的知识,下面开始: [注意]:创建失败这时会返回错误码,而通常函数创建失败都会返回-1,然后错误码会保存在errno当中. 下面用代码来实践一下: 在处理线程创建失败检查时,下面来看一下检查错误的一些说明: 所以下面来处理一下线程创建失败的错误: 这是什么意思呢? 而且每个线程都有自己的一个errono,避免多线程时有冲突. 接下来做这样的一个操作,就是主线程打印A字符,然后新创建的线程打印B字符, [注意…
今天继续研究posix IPC对象,这次主要是学习一下posix共享内存的使用方法,下面开始: 下面编写程序来创建一个共享内存: 编译运行: 那posix的共享内存存放在哪里呢?上节中学的posix的消息队列是在虚拟文件当中创建一个消息队列,需要我们手工将它挂载到某个目录下才能看到,同样的,posix共享内存也是需要将其挂载,只不过这个挂载操作是由系统完成的,而不用我们人工去操作了,已经挂载到了/dev/shm下了,如下: 接下来要介绍的函数为修改共享内存的大小: [说明]:实际上ftrunca…
继续接着上次的posix线程来学习: 回顾一下创建线程的函数: pthread_att_t属性变量是需要进行初始化才能够用的,一定初始化了属性变量,它就包含了线程的多种属性的值,那到底有哪些属性了,下面一一来介绍: 其中第二个参数的指定值可以通过man帮助来了解到: 下面用程序来实验一下: 编译运行: [注意]:在设置栈大小时,一般第二个参数设置为0表示用系统定义的栈的大小,如果指定我们自己设定的栈的大小可能会导致一些移植性的问题,所以一般情况下栈的大小不会去设置. 首先需要了解线程调度竞争范围…
linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这个函数会关闭所有和A相关的套接字,包括复制的:而close能直接关闭套接字. 1.close()函数 <span style="font-size:13px;">#include<unistd.h> int close(int sockfd);     //返回成功…
进程间的消息队列可以用这个实现,学习了下. http://blog.csdn.net/anonymalias/article/details/9799645?utm_source=tuicool&utm_medium=referral 消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据. 消息队列和之前讨论过的管道和FIFO有很大的区别,主要有以下两点: 一个进程向消息队列写入消息之前,并不需要某个进程在该队列上等待该消息的到达,而管道和FIFO是相…
1. 创建/获取一个消息队列 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For mode constants */ #include <mqueue.h> mqd_t mq_open(const char *name, int oflag); //专用于打开一个消息队列 mqd_t mq_open(const char *name, int oflag, mode_t mode…
Posix消息队列可以认为是一个消息链表. 有足够写权限的线程可以往队列中放置消息, 有足够读权限的线程可以从队列中取走消息 在某个进程往一个队列写入消息前, 并不需要另外某个进程在该队列上等待消息的到达. 这跟管道和FIFO是相反的, 因为对于管道,FIFO来说, 除非读出者已经存在, 光有写入者是没有意义的.一个进程在往某消息队列写入消息后, 终止进程. 另一个进程某时刻读出该消息;然而对于管带或FIFO而言, 当管道或FIFO的最后一次关闭发生时,仍在管道或FIFO中的数据将被抛弃 消息队…