IPC进程间通信问题笔记

来源:互联网 发布:黑客帝国矩阵革命在线 编辑:程序博客网 时间:2024/04/30 00:56


author:sun

-------------------------------------------------------------------------------------------------------

IPC

1.管道是进程间通信的一种方式。但有两种局限性:

   1)数据只能在一个方向上流动

   2)只能在具有公共祖先的进程之间使用。父进程创建管道,子进程通过管道继承其所有属性,不指向真实内存,只复制描述符本身。

       管道是由调用pipe函数创建的
  int pipe(int pipefd[2]);  传进一个数字。 返回两个文件描述符:pipefd[0]读 pipefd[1]写
  filefd[1] 的输出是 filfd[0]的输入,实现了进程间的信息流向。
  对于父到子的管道,父进程关闭读端fd[0],子进程关闭写端fd[1]。子到父的管道与此相反。
  当管道一端关闭之后:
      1)读一个写端被关闭的通道时,所有数据被读取之后,read返回0,以示到达了结尾。
      2)写一个读端被关闭的通道时,产生信号SIGPIPE。若忽略或捕捉并从处理程序中返回,write返回出错。
2.FIFO有名管道---硬盘上
  int mkfifo(const char *pathname, mode_t mode);
  pathname相当于管道名,mode是权限 成功返回0  一般文件函数都可打开它(open write close read)
  用途: 1)由shell命令以便将数据从一条管道线传送到另一条,无需创建临时文件。
            2)用于客户进程-服务器进程应用程序中,以便传递数据
  若用write写一个尚未为读而打开的FIFO,产生信号SIGPIPE。
  若FIFO的最后一个写进程关闭了该FIFO,则该FIFO的读进程产生一个文件结束标志。

共享内存:
1.int shmget(key_t key, size_t size, int shmflg);  创建共享内存  成功返回共享存储ID
  key标识符  0为私有名,说明共享内存不想被共享
  size是该共享存储端的长度(单位:字节)    shmflg权限位
2.int shmctl(int shmid, int cmd, struct shmid_ds *buf);  成功返回0
  cmd参数指定下列命令中一种,使其在shmid指定的段上执行
  IPC_STAT 获取共享内存属性,并放在buf指向的结构中。
  IPC_RMID 从系统中删除共享内存
3.void *shmat(int shmid, const void *shmaddr, int shmflg); 成功返回指向共享内存的指针
  shmaddr 为0,连接到内核的第一个可用地址
4.int shmdt(const void *shmaddr);  断开与共享内存联系
   shmaddr是调用shmat的返回值

  共享内存具有独立性。只有删除才会消失,进程结束并不影响共享内存。共享内存只有在调用的进程空间使用,若此时有其他进程调用需attach,此地址为虚拟地址。


消息队列

1.消息队列是消息的链接表,存放在内核中,并由消息队列标志符标志。
2.int msgget(key_t key, int msgflg);  创建消息队列
  返回消息队列ID。    用于接受发送消息。
3.int msgctl(int msqid, int cmd, struct msqid_ds *buf);  创建是对队列执行操作
  cmd参数: IPC_STAT获取属性  IPC_SET修改,先获取当前值记录下来修改要改变的,其他如之前的  
  IPC_RMID 删除
4.int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);成功返回0
  将数据放到消息队列中。发送消息  msgp指向消息内容
5.ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
  接收消息。从队列中取用消息。 msgsz数据缓冲区长度。
  msgtyp: == 0 返回队列中的第一个消息  > 0 返回消息队列消息类型为type的第一个消息
          <  0  返回队列中消息类型值小于或等于msgtyp绝对值的消息


0 0