一 线程间同步 
 
 同步:相互之间配合完成一件事情
 互斥:保证访问共享资源的完整性(有你没我)
 
 POSIX 线程中同步:使用信号量实现
 
 信号量 : 表示一类资源,它的值表示资源的个数
 
 对资源访问:
 p操作(申请资源) [将资源的值 - 1]
 ....
 V操作(释放资源) [将资源的值 + 1]
 
 1.定义信号量
 sem_t  sem ;
 
 2.初始化信号量 
 int sem_init(sem_t *sem, int pshared, unsigned int value);
 参数:
 @sem         信号量 
 @pshared     0:线程间使用 
 @value       初始化的信号量的值
 返回值:
 成功返回0,失败返回-1
 
 3.P操作 
 int sem_wait(sem_t *sem);
 
 4.V操作 
 int sem_post(sem_t *sem);
 二 进程间通信(进程间数据交互)
 
 (1)传统进程间通信方式
   [1]无名管道
   [2]有名管道
   [3]信号 
 
 (2)System 5 IPC对象进程间通信方式
   [1]消息队列
   [2]共享内存
   [3]信号灯集 
 
 (3)socket通信 
 
 (4)Android系统中增加Binder进程间通信方式 
 
 Linux 支持以上所有进程间通信方式
 
 三 管道进程间通信
 
 (1)无名管道 
 特点:
 只能用于具有亲缘关系进程间通信(具有亲缘关系的进程具有数据拷贝动作(复制父进程创建子进程))
 
 int pipe(int pipefd[2]);
 功能:创建一个无名管道 
 参数:
 @pipefd  获取操作无名管道的文件描述符  pipefd[0]:读无名管道 pipefd[1]:写无名管道
 返回值:
 成功返回0,失败返回-1 
 
 (2)管道读写规则  
 读端存在  ,写管道 ---->只要管道没有满,都可以写入数据到管道
 读端不存在,写管道 ---->此时写管道没有意义,操作系统会发送SIGPIPE杀死写管道的进程 
 
 写端存在,  读管道 ---->此时管道中读取数据,管道中没有数据,读阻塞
 写端不存在,读管道 ---->此时管道中读取数据,管道中没有数据,此时不阻塞,立即返回,返回值0
 
 (3)有名管道 
 特点:可以用于任意进程间通信,它是一种特殊的文件,在文件系统存在名字,
      而文件中存放的数据是在内核空间,而不是在磁盘上
 
 1.创建一个有名管道文件 
 int mkfifo(const char *pathname, mode_t mode);
 @pathname  有名管道存在的路径 
 @mode      有名管道的权限 
 返回值:
 成功返回0,失败返回-1 
 
 2.打开有名管道文件 
 
 open 
 
 如果有名管道的一端以只读的方式打开,会阻塞,直到另一端以写(只写或读写)的方式打开
 如果有名管道的一端以只写的方式打开,会阻塞,直到另一端以读(只读或读写)的方式打开
 
 
 3.读写操作  
 read /write 
 
 4.关闭管道文件
 close(fd);
 
 四 信号 
 
 信号是异步进程间通信方式
 
 进程对信号的响应方式:
 <1>忽略
   SIGKILL 和 SIGSTOP 不能忽略
 
 <2>捕捉
   当进程收到信号,此时执行的信号处理函数  
 
 <3>默认
   大部分信号对进程的默认操作方式都是杀死进程
   子进程状态发生改变的时候,操作系统向父进程发送SIGCHLD,默认对它处理方式是忽略
 
 typedef  void (*sighandler_t)(int);
 sighandler_t signal(int signum, sighandler_t handler);
 功能:设置进程对信号处理方式
 参数:
 @signum  信号的编号 
 @handler 
  SIG_IGN : 忽略信号 
  SIG_DFL : 使用默认处理方式
  函数名  : 捕捉方式处理 
 
 返回值:
 成功返回handler,失败返回SIG_ERR 
 
 练习:
 如何进行不阻塞,不轮训方式回收僵尸态子进程
 
 
 2.在进程中设置一个定时器 
 
 unsigned int alarm(unsigned int seconds);
 参数:
 @seconds 定时的时间,以秒为单位
 
 注意:
 一旦定时时间完成,操作系统就会向进程发送SIGALRM信号 
 A进程:
 读文件,写管道 
 
 A进程结束条件:文件没有数据可读
 
 B进程:
 读管道,写文件 
 
 B进程结束条件:在写端关闭,读端不阻塞,如果管道中没有数据,读管道会返回0
  
linux系统编程(3)
原文:http://blog.51cto.com/13375232/2054048