现在的位置: 首页 > 综合 > 正文

Linux系统编程概略

2018年10月17日 ⁄ 综合 ⁄ 共 3387字 ⁄ 字号 评论关闭

基础知识

文件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);

并发编程

进程控制原语

fork  execexitwait  waipidatexitgetpidabort

线程控制原语

线程创建

int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*start_rtn)(void *), void *arg);

线程终止
从启动例程返回,返回值是线程的退出码
被同一进程中的其他线程取消
调用pthread_exit
void pthread_exit(void *p_return_value);
 
获得线程的退出码
int pthread_join(pthread_t tid, void **pp_return_value);
 
线程清理处理程序
void pthread_cleanup_push(void (*rtn)(void *), void *arg);
void pthread_cleanup_pop(int execute);
 
返回线程ID
pthread_t pthread_self();
 
取消同一进程中的其他线程
int pthread_cancel(pthread_t tid);

线程互斥与同步

互斥量 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

消息队列 信号量 共享存储器

【上篇】
【下篇】

抱歉!评论已关闭.