Unix网络编程——简介
2015-11-20 10:52
645 查看
1.简介:
1.IPC 进程间通信方式:1.管道 2.System V 消息队列 3.Posix消息队列 4.远程过程调用2.保持进程间的同步操作:1.文件系统 2.记录上锁 3.System V信号量 4. Posix 信号量 5.互斥锁 6.读写锁
3.进程间的信息共享:1.穿过内核,访问文件系统的文件信息 2.共享驻留于内核的信息 3.共享内存区
4.IPC对象的持续性:1.随着文件系统,2.随着内核,3.随着进程持续的
2.Posix IPC:
1.以下三种类型的IPC合称为“Posix IPC”,分别是Posix消息队列、Posix信号量、Posix共享内存区2.Posix IPC函数汇总:
| 消息队列 | 信号量 | 共享内存区 |
头文件 | <mqueue.h> | <semaphore.h> | <sys/mman.h> |
创建、打开或删除IPC函数 | mq_open mq_close mq_unlink | sem_open sem_close sem_unlink | shm_open shm_unlink |
sem_init sem_destory | |||
控制IPC操作的函数 | mq_getattr mq_setattr | | ftruncate fstat |
IPC操作函数 | mq_send mq_receive mq_notify | sem_wait sem_trywait sem_post sem_getvalue | mmap munmap |
它必须符合已有的路径名规则(必须最多由PATH_MAX个字节构成,包括结尾的空字节)。
如果它以斜杠符开头,那么对这些函数的不同调用将访问同一个队列。如果它不以斜杠符开头,那么效果取决于实现。
名字中额外的斜杠符的解释由实现定义。为移植起见,必须以一个斜杠开头,并且不能包含其他的斜杠符。
为了解决移植性的问题,我们使用了px_ipc_name函数:
#include "unpipc.h" char* px_ipc_name(const char* name) { char* dir,*dst,*slash; if((dst = malloc(PATH_MAX))==NULL) return NULL;//分配失败 if((dir=getenv("PX_IPC_NAME"))==NULL) {//目录名 #ifdef POSIX_IPC_PREFIX dir = POSIX_IPC_PREFIX; #else dir = "/tmp/"; #endif } slash = (dir[strlen(dir)-1] == '/')?"":"/"; snprintf(dst,PATH_MAX,"%S%S%S",dir,slash,name);//全路径名称 return dst; }
4.创建和打开IPC通道:
说明 | mq_open | sem_open | shm_open |
只读 | O_RDONLY | | O_RDONLY |
只写 | O_WRONLY | | |
读写 | O_RDWR | O_RDWR | |
若不存在则创建 | O_CREAT | O_CREAT | O_CREAT |
排他性创建 | O_EXCL | O_EXCL | O_EXCL |
非阻塞模式 | O_NONBLOCK | | |
若已存在则截短 | | | O_TRUNC |
基于如下信息执行权限测试:
2、 所请求的访问类型(O_RDONLY、O_WRONLY或O_RDWR);
3、 调用进程的有效用户ID、有效组ID以及各个辅助组ID;
执行权限测试的步骤:
2、 在当前的进程的有效用户ID等于该IPC对象属主ID的前提下,如果相应的用户访问权限位已设置,那就允许访问,否则就拒绝访问;
3、 当前进程的有效组ID或它的某个辅助组ID等于该IPC对象的组ID的前提下,如果相应的组访问权限已设置,那就允许访问,否则拒绝访问;
4、 如果相应的其他用户访问权限已设置,那就允许访问,否则拒绝访问。
3.System V IPC
1.也有类似于上面三种的IPC类型,分别是消息队列、信号量、共享内存区2、key_t键和ftok函数
三种类型的IPC使用key_t值作为他们的名字,头文件<sys/types.h>把key_t定义为一个整数,通常是一个至少32位的整数,由ftok函数赋予的。函数ftok把一个已存的路径和一个整数标识符转换成一个key_t值,称为IPC键。函数原型如下:
#include <sys/types.h>#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id); //成功返回IPC键,出错返回-1
3、ipc_perm结构
内核给每个IPC对象维护一个信息结构,内容跟内核给文件维护的信息类似。Unix下结构信息如下:
struct ipc_perm
{
key_t key; /* Key supplied to semget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short seq; /* Sequence number */
};
4、创建与打开IPC通道
对于key值,有两种选择:
(1)调用fotk函数,给它传递pathname和id。
(2)指定key为IPC_PRIVATE,保证会创建一个新的、唯一的IPC对象。
5、标识符重用
System V IPC 标识符是系统范围的,不是特定于进程的。ipc_perm结构含有一个名为seq的变量,是内核为系统每个潜在的IPC对象维护的计数器,每当删除一个IPC对象时,内核就递增相应的槽位号,若溢出则循环到0。这样避免短时间内重用System V IPC标识符,有助于确保过早终止的服务器重新启动后不会重用标识符。
6、ipcs和ipcrm程序
System V IPC的三种类型不是以文件系统中的路径名标识的,不能使用ls和rm程序查看和删除。而是同ipcs程序输出System V IPC特性的各种信息,ipcrm则删除一个System V 消息队列、信号量或共享内存区。
ipcs - 分析消息队列、共享内存和信号量
ipcs [-mqs] [-abcopt] [-C core] [-N namelist]
-m 输出有关共享内存(shared memory)的信息
-q 输出有关信息队列(message queue)的信息
-s 输出信号量(semaphore)的信息
ipcrm - 删除ipc(清除共享内存信息)
ipcrm -m|-q|-s shm_id
-m 输出有关共享内存(shared memory)的信息
-q 输出有关信息队列(message queue)的信息
-s 输出信号量(semaphore)的信息
相关文章推荐
- TCP长连接与短连接
- HTTP网络请求Apache方式的简单封装
- 为 MySQL 增加 HTTP/REST 客户端:MySQL UDF 函数 mysql-udf-http 1.0 发布
- HTTP协议详解
- 话说“TCP长连接与短连接”
- HttpClient 讲解 (3) 智能拼装
- jquery has deprecated synchronous XMLHTTPRequest
- 深入理解openstack网络架构(4)-----连接到public network
- 错误:App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insec
- 深入理解openstack网络架构(3)-----路由
- jsp spring mvc 上传时HTTP Status 405 - Request method 'GET' not supported是什么原因
- 深入理解openstack网络架构(2)----Basic Use Cases
- 全国著作权案件超一半涉及网络 电子数据取证难题已有“良方”
- 深入理解openstack网络架构(1)
- http://bbs.chinaunix.net/thread-169061-1-1.html
- [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍
- 大端法、小端法、网络字节序 转
- linux命令-网络相关
- SIM800H NTP网络授时
- 在IIS上启用Gzip压缩(HTTP压缩)