UNIX環境高階程式設計 第一章
阿新 • • 發佈:2021-10-02
程式碼筆記,僅供自己學習使用。
下面是通過呼叫呼叫dirent的系統庫實現,檢視目錄下內容的模組
#include "apue.h" #include <dirent.h> int main(int argc, char *argv[]){ DIR *dp; struct dirent *dirp; if (argc != 2) { err_quit("usage: ls directory_name"); } if ((dp = opendir(argv[1])) == NULL) { //系統函式庫函式實現 err_sys("can't open %s", argv[1]); } while ((dirp = readdir(dp)) != NULL) { printf("%s\n", dirp->d_name); } closedir(dp); exit(0); }
書中說明了每個程序都有一個工作目錄。
1.5輸入和輸出
#include "apue.h" #define BUFFSIZE 4096 int main(void) { int n; char buf[BUFFSIZE];/*通過系統的unistd.h的標頭檔案, 不帶緩衝的io進行操作.讀到檔案的末端返回0*/ while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) { if (write(STDIN_FILENO, buf, n) != n) { err_sys("write error"); } } if (n < 0) { err_sys("read error"); } exit(0); }
下面是通過表示stdio進行輸入輸出的操作,這裡不需要自己手動設定緩衝區。
#include "apue.h" int main(void){ int c; while ((c = getchar()) != EOF) { if (putc(c, stdout) == EOF) { err_sys("output error"); } } // 讀寫模式不匹配報這個錯誤 if (ferror(stdin)) { err_sys("input error"); } exit(0); }
1.6 程式與程序
程式(program)是一個儲存在磁碟上莫個目錄中的可執行,程式的執行例項被稱為程序(process),每個程序獨有一個程序id
#include "apue.h" int main(void) { printf("hello world from process ID %ld\n", (long)getpid()); printf("ppid = %ld\n", (long)getppid()); exit(0); }
模擬程式從標準輸入讀入並執行命令。
#include "apue.h" #include <sys/wait.h> int main(void) { char buf[MAXLINE]; pid_t pid; int status; printf("%% "); // 等待接收命令的提示 while (fgets(buf, MAXLINE, stdin) != NULL) { //fgets會將std中的所有內容全部讀進去,包括\n if (buf[strlen(buf) - 1] == '\n'){ buf[strlen(buf) - 1] = 0; /* 加入讀取有換行符去除換行符 */ } if ((pid = fork()) < 0) { /* 這裡將產生一個pid為0的子程序 */ err_sys("fork error"); }else if(pid == 0){ // 子程序在這裡執行 execlp(buf, buf, (char*)0); err_ret("couldn't execute: %s", buf); exit(127); } if ((pid = waitpid(pid, &status, 0)) < 0) { err_sys("waitpid error"); } printf("%% "); } exit(0); }
1.7出錯處理
#include "apue.h" #include <errno.h> int main(int argc, char *argv[]) { fprintf(stderr, "EACCES: %s\n", strerror(EACCES)); // 傳入指定的錯誤值 errno = ENOENT; // 賦值系統error值為指定的錯誤值 perror(argv[0]); exit(0); }
1.8使用者標識
#include "apue.h" int main(void) { printf("uid = %d, gid = %d\n", getuid(), getgid()) exit(0); }
1.9訊號
#include "apue.h" #include <sys/wait.h> static void sig_int(int); int main(void) { char buf[MAXLINE]; pid_t pid; int status; if (signal(SIGINT, sig_int) == SIG_ERR) { err_sys("signal error"); } printf("%% "); // 等待接收命令的提示 while (fgets(buf, MAXLINE, stdin) != NULL) { //fgets會將std中的所有內容全部讀進去,包括\n if (buf[strlen(buf) - 1] == '\n'){ buf[strlen(buf) - 1] = 0; /* 加入讀取有換行符去除換行符 */ } if ((pid = fork()) < 0) { /* 這裡將產生一個pid為0的子程序 */ err_sys("fork error"); }else if(pid == 0){ // 子程序在這裡執行 execlp(buf, buf, (char*)0); err_ret("couldn't execute: %s", buf); exit(127); } if ((pid = waitpid(pid, &status, 0)) < 0) { err_sys("waitpid error"); } printf("%% "); } exit(0); } void sig_int(int signo){ printf("interrupt\n%% "); }
不是很理解,
1.10時間值
日曆時間,記錄用時間戳
程序時間:三個
時鐘時間,使用者時間,系統CPU時間, 用time函式可以檢視。