您的位置:首页 > 理论基础 > 计算机网络

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

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_RDONLY、O_WRONLY或O_RDWR);

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

执行权限测试的步骤:


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

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)的信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: