7月6日笔记-进程

2015年07月06日

学习内容出自:一步步学习Linux多任务编程

  • 进程间通信:管道
    管道:叫无名管道,是UNIX系统IPC最古老的形式
    无名管道是一种特殊类型的文件
    在默认情况下,从管道中读写数据,最主要的特点是阻塞问题:
    1、没数据会阻塞
    2、缓冲区满时,write()也会阻塞
    3、通信过程中,别的进程先结束后,当前读端口关闭后,write()所在的进程会退出
  • 进程间通信:命名管道
    命名管道:FIFO、有名管道、FIFO文件
    命名管道的创建:int mkfifo(const char *pathname,mode_t mode);
    阻塞特性:
    1、只读等只写,只写等只读
    2、FIFO中无数据,read()阻塞
    3、通信过程中若写进程先退出了,即便FIFO中无数据,read()从FIFO中读数据也不阻塞;若写进程重新运行,则read()恢复阻塞
    4、通信过程中读进程退出后,写进程向命名管道内写数据,写进程也会退出
    5、缓冲区满时write()也会阻塞
    命名管道非阻塞标志操作
    O_NONBLOCK
    特点:对于open()来说,
    先以只读方式打开,若无进程为写而打开一个FIFO,open()能成功
    先以只写方式打开,若无进程为读而打开一个FIFO,open()出错
    对于read(),write()来说不阻塞
  • 消息队列
    消息队列提供了一种在两个不相关的进程之间传递数据的高效方法
    特点:消息队列可实现消息的随机查询,可按消息的类型读取
    消息队列是消息的链表,存在内存中,由内核维护,只有内核重启或人工删除消息队列时,该消息队列才会被删除。若不人工删除消息队列,消息队列会一直存在系统中
    key值:可以保证是同一个消息队列
    消息队列表示符:保证不同的进程可以相互通信
    同一个消息类型保证某个进程取出是对方的信息
    key值的获取:key_t ftok(const char *pathname,int proj_id);
    消息队列的创建:int msgget(key_t key,int msgflg);
    查看消息队列:ipcs -q
    删除消息队列:ipcrm -q 消息队列ID
    消息队列的读写操作
    1、了解消息队列的格式
    2、
    添加:
    int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgglg);
    获取:
    ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg)
    注:在获取某类型消息时,若队列中有多条此类型消息,则获取最先添加的消息(先进先出原则)
    消息队列的控制:
    int msgctl(int msqid,int cmd,struct msqid_ds *buf);
  • 共享内存
    注:多个进程之间对一个给定存储区访问互斥:若一个进程正在向共享内存区写数据,则在它做完这一步操作前,别的进程不应当去读写这些数据
    常用函数
    1、创建或打开一块内存:
    int shmget(key_t key,size_t size,int shmflg);
    查看共享内存:ipcs -m
    删除共享内存:ipcrm -m 号码
    2、共享内存映射:让进程和内存建立一种联系
    void *shmat(int shmid,const void *shmaddr,int shmflg)
    返回值:共享内存段映射地址
    解除共享内存映射:int shmdt(const void,*shmaddr);
    注:这仅仅是断开联系并不删除共享内存
    共享内存控制
    int shmctl(int shmid,int cmd,struct shmid_ds *buf);