高階io函式與伺服器程式規範

2021-07-24 12:21:46 字數 3484 閱讀 4461

單向管道實現管道pipe(int fd[2]) fd[0]讀 fd[1]寫

雙向管道基本本地的,前三個引數和socket一模一樣

socketpair(int domain,int type, int protocol,int fd[2])
dup函式和dup2函式

dup(fd) 複製乙個新的描述符,和原來的一樣,總是取得當前系統可用的最小值

dup(int fd1,int fd2) 同dup一樣,返回乙個不小於dup2的整數

**片段

int connfd = accept( sock, ( struct sockaddr* )&client, &client_addrlength );

if ( connfd < 0 )

else

close( sock );

readv函式和writev函式,readv將資料從檔案描述符讀到分散的記憶體塊,分散讀,readv將分散的記憶體塊寫入檔案描述符集中寫

readv(fd,struct iovec*vector,int count)

writev(fd,struct iovec*vector,int count);

兩個檔案描述符之間直接傳輸資料 sendfile,為網路上傳輸檔案而設計 零拷貝

sendfile(in_fd,out_fd,off*offset,size_t count);

in_fd只能是檔案描述符 不能是

out_fd只能是socket 不能是檔案描述符

if ( connfd < 0 )

else

mmap函式和munmap函式 或者程序間的共享記憶體,檔案對映到記憶體

mmap(void *start,size_t len,int prot,int fd, int flag)

munmap(void *start,size_t len)

splice 兩個檔案描述符之間移動資料 零拷貝

splice(fd_in,off_in,fd_out,off_out,size_t len,int flag)
tee 兩個管道檔案描述符之間複製資料 零拷貝,不消耗資料,讀後任然可以繼續讀

tee(fd_in,fd_out,size_t len, int flag)
fcntl 檔案描述符的各種操作

fcntl(fd,int cmd,...)
int setnoblocking(int fd)
系統提供兩個日誌服務

syslogd

rsyslogd更高階的

使用者通過syslog()函式和rsyslogd通訊

syslog(int priority日誌級別,const char* message,...);
改版syslog的預設輸出

openlog(char * ident,int logopt,int facility)
設定掩碼setlogmask(int)

關閉日誌 closelog();

使用者資訊

getuid(),geteuid(),getgid(),getegid(),

setuid(uid_t uid) seteuid(uid_t uid) setgid(uid_t uid) setegid(uid_t uid),

uid_t uid = getuid();

uid_t euid = geteuid();

printf( "userid is %d, effective userid is: %d\n", uid, euid );

return

0;

程序間的關係

每個程序屬於乙個程序組,程序組 getpgid(pid)  setpgetid(pid,pgid)

一些關聯程序組形成乙個回話 getsid(pid) setsid(void)

系統資源限制

getrlimit(int res,struct rlimit*rlim)   setrlimit(int res,struct rlimit*rlim)

rlimit_as 虛擬記憶體總量

rlimit_core 程序核心轉儲存檔案的大小限制

rlimit_cpu cpu時間限制

rlimit_data 程序資料段限制

rlimit_fsize 檔案大小限制

rlimit_nofile 檔案描述符限制

rlimit_nproc 使用者建立程序限制

rlimit_sigpending 掛起的訊號量限制

rlimit_stack 程序棧記憶體限制

改變工作目錄和當前目錄

char* getcwd(char*buf,size_t size)

chdir(char *path)

chroot(char *path)

linux的函式庫設定守護程序

int daemon(int nochdir,int noclose)

工作目錄 標準輸入輸出錯誤

#include 

#include

#include

#include

#include

#include

bool daemonize();

int main(int argc, char

const *argv)

return0;}

bool daemonize()

else

if ( pid > 0 )

//設定掩碼,許可權設定

umask( 0 );

// 新建乙個回話脫離原來的的會員

pid_t sid = setsid();

if ( sid < 0 )

//切換到根目錄

if ( ( chdir( "/" ) ) < 0 )

close( stdin_fileno );//關閉輸入

close( stdout_fileno );//關閉輸出

close( stderr_fileno );//關閉錯誤

//輸入輸出到null

open( "/dev/null", o_rdonly );

open( "/dev/null", o_rdwr );

open( "/dev/null", o_rdwr );

return

true;

}

Linux伺服器程式規範

在unix程序中涉及多個使用者id和使用者組id,包括如下 有效使用者id為root的程序稱為特權程序 一些有關聯的程序組可以形成乙個會話,下面函式用於建立乙個會話 include pid t setsid void 該函式不能由程序組的首領程序呼叫,否則產生錯誤。對於非首領程序,呼叫該函式不僅建立...

伺服器規範

1 分割槽規範 1.1web伺服器 卷標 容量 mb 捲組 vg 邏輯卷 lv boot 100mb swap 4g 30g vg01 lvroot www 剩餘空間 vg01 lvmydata 1.2mysql伺服器 卷標 容量 mb 捲組 vg 邏輯卷 lv boot 100mb swap 4g...

伺服器巡檢規範

1.檢查伺服器運 況,記憶體負載,儲存負載,cpu負載,網路負載,負載過高時進行資源釋放操作,或者對資源進行擴容 2.檢查機房伺服器以及儲存上的硬碟指示燈,報紅或報黃時,排查原因,若硬碟損壞或將要損壞,應及時對相應硬碟進行更換 3.檢查機房溫度,確保機房空調的製冷以及送風功能正常,檢查機房濕度,確保...