Unix网络编程——简介

原创 2015年11月20日 10:52:09

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






Unix网络编程(卷一)-第一个简单的时间获取程序

1 前言 自己一直想闹明白Unix网络编程到底是怎么一回事,所以开启这个系列文章。这个文章系列将会持续下去,直到不再Coding为止。 2 运行第一个实例 这篇博客是《Unix 网络编程卷一:套接字联...
  • shenwanjiang111
  • shenwanjiang111
  • 2016年09月06日 18:37
  • 1238

Linux 网络 I/O 模型简介(图文)

1、介绍 Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一...
  • anxpp
  • anxpp
  • 2016年05月26日 01:12
  • 19272

UNIX环境高级编程、UNIX网络编程(卷一)环境搭建

最近学习这两本书,在直接编译书本源程序时,出现头文件“apue.h”(UNIX环境高级编程)及“unp.h”(UNIX网络编程)错误,在这里坐下配置的笔记。 首先需要安装Linux系统。(在Virtu...
  • luokh327
  • luokh327
  • 2016年01月12日 16:40
  • 1559

《Unix网络编程卷1》笔记(1):第一章简介——使用Cygwin运行示例代码

内容概要: 1.      网络里非常重要的一个模型:C(客户端client)-S(服务器server)模型,进程间构成该模型,可能在不同主机上,也可能在同一主机上。 2.      TCP/IP...
  • u010931294
  • u010931294
  • 2013年06月07日 22:40
  • 1054

unix网络编程---读书笔记(一)---tcp/udp/sctp简介

本博客为系列博客,主要记录 《UNIX网络编程 卷一》相关读书笔记; 此篇博客主要针对 第一部分 :简介和 TCP/IP 进行网络编程,首先要确认网络通信协议(protocol);Unix网络编...
  • lx1607
  • lx1607
  • 2016年05月01日 15:51
  • 3831

unix网络编程之简介和运输层TCP/UDP

前言:本文只介绍了有关UNIX网络编程的理论知识,具体的应用和例子在稍后的博文中将更新 第一章  简介 一个简单的服务器程序步骤: 说明:1.创建TCP套接口       2.捆绑服务器的...
  • ts173383201
  • ts173383201
  • 2012年08月15日 20:07
  • 1956

《UNIX网络编程》读书笔记1---简介和TCP/IP

这本书我不打算读完,因为很多细节更倾向于用库去封装,对于原理的东西更感兴趣, 所以我有兴趣研究一下本书的IO的认识,还有TCPv1以及UNP2 主要打算阅读的部分包括, 第一部分 第1,2章。 第二部...
  • u010087886
  • u010087886
  • 2015年10月14日 15:21
  • 332

UNIX 网络编程 卷一:套接字联网API(第3版) 读书笔记(1) 第一章 简介

一、OSI模型和网际协议簇中的各层二、网络拓扑的发现1、netstat -i 提供网络接口的信息。我们还提供指定-n标志以输出数值地址其中环回(loopback)接口称为lo,以太网接口称为eth02...
  • sky1737
  • sky1737
  • 2011年03月28日 12:03
  • 481

UNIX网络编程I-01简介

重点:  服务进程使用TCP通信,TCP又转而使用IP通信, IP再通过某种形式的数据链路层通信。  客户与服务器之间的信息流在其中一端是向下通过协议栈的, 跨越网络之后, 在另一端是向上通过协议...
  • iegad2011
  • iegad2011
  • 2014年12月23日 21:04
  • 166

Unix网络编程 之 socket简介

概述         Socket的英文原意是“孔”或“插座”,现在,作为Unix的进程通信机制,常常取“插座”这一意义。日常生活中常见的插座,有的是信号插座,有的是电源插座,有的可以接收信号或能量...
  • zhaobryant
  • zhaobryant
  • 2014年08月15日 17:05
  • 895
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unix网络编程——简介
举报原因:
原因补充:

(最多只允许输入30个字)