雨落空林

Be Happy.

APUE读书笔记 - UNIX System Overview

环境设置

操作环境:Ubuntu14.04
我将源代码解压到目录:~/codes
在使用源码编译(make)的时候,出现/usr/lib/ld: cannot find -lbsd错误。
执行sudo apt-get install libbsd-dev解决上面的错误,再次使用make编译。

首先测试第一个程序myls.c

#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);
}

gcc -o myls myls.c -I ~/codes/apue.3e/include/ -L ~/codes/apue.3e/lib/ -lapue

-I: 告诉gcc include路径在哪里
-L: 告诉gcc library库的路径
-lapue: 说要在lib中找include下apue文件对应的libapue.a或者libapue.so,就是找到编译过apue.h中的函数。

但是这样做命令行有点长, 可以把gcc环境变量导入进来:

export C_INCLUDE_PATH=/$HOME/codes/apue.3e/include/
export LIBRARY_PATH=/$HOME/codes/apue.3e/lib/
之后就可以使用gcc -o myls myls.c -lapue来编译了。
其实也可以直接写入文件~/.bashrc或者写入一个名为apue.ini的配置文件。
并使用sourc命令. apue.ini把变量加载到shell中。

进程和线程

程序的执行实例被称为进程(process), unix系统确保每个进程都有一个唯一的数字标示符,称为进程ID(process ID);

线程是运行在一个单一进程上下文中的逻辑刘,有内核进行调度。一个进程内的所有线程共享同意地址空间、文件描述符、栈以及进程相关的属性。与进程一样,线程也有一个唯一的线程ID(thread ID)

简单的unix系统进程控制功能
#include "apue.h"
#include <sys/wait.h>

int main(void){

    char buf[MAXLINE]; /* form apue.h */
    pid_t pid;
    int status; 

    printf("%% "); /* print promt (printf requires %% to print %)  */
    while (fgets(buf, MAXLINE, stdin) != NULL){
        if (buf[strlen(buf) - 1] == '\n')
            buf[strlen(buf) - 1] = 0; /* replace newline with null */
        if ((pid = fork()) < 0){
            err_sys("fork error");
        }else if (pid == 0) { /* child */
            execlp(buf, buf, (char *)0);
            err_ret("couldn't execute: %s", buf);
            exit(127);
        }

        /* parent */
        if ((pid = waitpid(pid, &status, 0) < 0)){
                err_sys("waitpid error");
        }
        printf("%% ");
   }
   exit(0);
}

用户标识

用户ID,组ID(组文件将组名映射位数值的组ID,组文件通常是/etc/group)。
ls -l 命令使用口令文件将数值的用户ID映射位登录名,从而打印出文件所有者的登录名。
关于 ls -l 的各个列的意思需要明白。

In addition to the name of each file, print the file type, file mode bits, number of hard links, owner name, group name, size, and timestamp (*note Formatting file timestamps::), normally the modification time.

更多的信息可以查看 info ls

信号,时间值

信号(signal)用于通知进程发生了某种情况。进程的三种处理信号的方式:

忽略信号。
按系统默认方式处理。很多情况下是终止该进程。
提供一个函数,信号发生时调用该信号(捕捉信号)。

要获取任一进程的时钟时间、用户时间和系统时间只需要使用time(1)命令。

time ls -l > /dev/null
real 0m0.007s
user 0m0.000s
sys 0m0.004s

Reference

An Introduction to GCC - 3.1.2小节
摘抄APUE Chapter 1 - UNIX System Overview