Unix网络编程——简介

来源:互联网 发布:docker安装ubuntu镜像 编辑:程序博客网 时间:2024/05/18 09:10

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


3.IPC名字:
它必须符合已有的路径名规则(必须最多由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


5.IPC权限:
基于如下信息执行权限测试:

1、  创建时赋予该IPC对象的权限位;

2、  所请求的访问类型(O_RDONLYO_WRONLYO_RDWR);

3、  调用进程的有效用户ID、有效组ID以及各个辅助组ID

执行权限测试的步骤:

1、  如果当前进程的有效用户ID0,那就允许访问;

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)的信息






0 0
原创粉丝点击