基础知识
文件IO
int open(const char *pathname, int oflag, mode_t mode);
int close(int fd);
off_t lseek(int fd, off_t offset, int whence); // whence: SEEK_SET SEEK_CUR, SEEK_END
ssize_t read(int fd, void *buf, size_t nbytes);
ssize_t write(int fd, const void *buf, size_t nbytes);
fcntl
高级IO
非阻塞IO
对一个描述符调用open或fcntl函数,指定O_NONBLOCK标识,可将其设为非阻塞。非阻塞IO使read、write等操作永远不会阻塞,如果操作不能完成,则调用立即出错返回。
记录锁
当一个进程正在读或写文件的某个部分时,它可以阻止其他进程写同一文件区。又称为字节范围锁。
int fcntl(int fd, int cmd, struct flock *pflock);
cmd是 F_GETLK, F_SETLK, F_SETLKW
struct flock
{
short l_type; // F_RDLCK, F_WRLCK, F_UNLCK
off_t l_start; // offset in bytes, relative to l_whence
short l_whence; // SEEK_SET, SEEK_CUR, SEEK_END
off_t l_len; // length in bytes, 0 means lock to EOF
pid_t l_pid; // returned with F_GETLK
};
具体可见《APUE》p357.
IO复用
select模型
int select(int maxfdp1, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *tvptr);
参数说明:
maxfdp1是指最大描述符加1
fd_set 描述符集
int FD_ISSET(int fd, fd_set *set);
void FD_CLR(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);
struct timeval
{
long tv_sec; // 秒
long tv_usec; // 微秒
};
epoll模型
异步IO
基于信号
readv和writev函数——散布读和聚集写
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
参数说明:
iov: 指向struct iovec数组
struct iovec
{
void *iov_base;
size_t iov_len;
};
iovcnt: 数组元素数目
存储映射IO
使一个磁盘文件与存储空间中的一个缓冲区相映射。从缓冲区取数据,相当于从文件读数据。将数据存入缓冲区,相当于写入文件。
void *mmap(void *addr, size_t len, int prot, int flag, int fd, off_t off);
int munmap(caddr_t addr, size_t len);
并发编程
进程控制原语
线程控制原语
线程创建
int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*start_rtn)(void *), void *arg);
线程互斥与同步
互斥量 pthread_mutex_t
int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutex_attr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
读写锁 pthread_rwlock_t
int pthread_rwlock_init(pthread_rwlock_t *rwlock, pthread_rwlock_attr_t *attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
条件变量 pthread_cond_t
int pthread_cond_init(pthread_cond_t*cond,pthread_cond_attr_t *attr);
intpthread_cond_destroy(pthread_cond_t*cond);
int pthread_cond_wait(pthread_cond_t*cond,pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *timeout);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
进程间通信
管道
管道是UNIX系统IPC的最古老形式,所有UNIX系统都提供此种通信机制。有两种局限性:
(1)历史上,管道是半双工的。现在,某些系统提供全双工管道,但是为了最佳的可移植性,绝不应假设系统提供此特性。
(2)管道只能在具有公共祖先的进程之间使用。通常,一个进程创建一个管道,然后调用fork创建子进程,此后父子进程就可应用该管道。
创建管道
int pipe(int fds[2]);
参数说明:
数组fds[2]返回两个文件描述符,fds[0]为读而打开,fds[1]为写而打开。
FILE *popen(const char *cmdstring, const char *type);
int pclose(FILE *fp);
函数popen执行fork,调用exec以执行cmdstring,并且返回一个标准IO文件指针。如果type是“r”,则文件指针连接到cmdstring的标准输出。如果type是“w”,则文件指针连接到cmdstring的标准输入。
协同进程
当一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出时,则该过滤程序就成为协同进程。
FIFO——命名管道
int mkfifo(const char *pathname, mode_t mode);
返回值:成功返回0,失败返回-1
用mkfifo创建了一个FIFO后,一般的文件IO函数open、close、read、write等都可用于FIFO。
XSI IPC
消息队列 信号量 共享存储器