Linux系統程式設計概略

2021-06-09 14:57:04 字數 3842 閱讀 1129

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

對乙個描述符呼叫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

;具體可見《apue》p357.

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

;epoll模型基於訊號

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

;iovcnt: 陣列元素數目

使乙個磁碟檔案與儲存空間中的乙個緩衝區相對映。從緩衝區取資料,相當於從檔案讀資料。將資料存入緩衝區,相當於寫入檔案。

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的標準輸入。

協同程序

當乙個程式產生某個過濾程式的輸入,同時又讀取該過濾程式的輸出時,則該過濾程式就成為協同程序。

int mkfifo(const char *pathname, mode_t mode);

返回值:成功返回0,失敗返回-1

用mkfifo建立了乙個fifo後,一般的檔案io函式open、close、read、write等都可用於fifo。

訊息佇列 訊號量 共享儲存器

Linux 系統程式設計

1 i o操作 2 檔案和目錄管理 3 記憶體管理 1 建立匿名記憶體對映 2 對映 dev zero檔案 類unix 作業系統中,dev zero是乙個特殊的檔案,當你讀它的時候,它會提供無限的空字元 null,ascii nul,0x00 其中的乙個典型用法是用它提供的字元流來覆蓋資訊,另乙個常...

Linux系統程式設計

1.linux程序 守護程序 脫離終端的後台程序 2.linux程序 殭屍程序 3.linux 下程序通訊 其中setsockopt server sockfd,sol socket,so reuseaddr,on,sizeof on 因為每乙個連線都由本地位址和遠端位址的組合唯一確定,所以只要遠端...

Linux系統程式設計 Linux系統呼叫

linux 系統呼叫 庫函式 目錄 系統呼叫概述 系統呼叫的實現 系統呼叫和庫函式的區別 系統呼叫,顧名思義,說的是作業系統提供給使用者程式呼叫的一組 特殊 介面。使用者程式可以通過這組 特殊 介面來獲得作業系統核心提供的服務,比如使用者可以通過檔案系統相關的呼叫請求系統開啟檔案 關閉檔案或讀寫檔案...