1. 程式人生 > 其它 >UNIX環境高階程式設計 第一章

UNIX環境高階程式設計 第一章

程式碼筆記,僅供自己學習使用。

下面是通過呼叫呼叫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函式可以檢視。