首页 > 代码库 > <unix高级编程>笔记 chapter1

<unix高级编程>笔记 chapter1

os严格上是软件,为计算机提供资源和app运行环境. 特称为内核.

内核的接口被成为system call;然后库函数对system call进行了封装;shell是特殊app,为运行其他程序提供了一个接口.

shell是个命令行解释器,读取输入,执行命令.

unix文件系统是由directory和file组成.目录起点成为root,名字是/.

文件属性指类型\大小\所有者\权限以及修改时间.stat和fstat返回文件属性的结构.

比如下面操作:




2.文件名

只有/和null不能出现在文件名里.因为/用来分割构成路径名,null用来终止一个路径名.

创建新目录的适合会自动创建两个文件名.和..

点指当前目录,..指上一级目录.


3.路径名

一个或者多个/构成路径名.

以/开头指相对路径,否则是绝对路径. 其实经常用的是相对路径.


实战:

1.列出目录下的所有文件.就是实现ls功能.

#include <dirent.h>
#include "stdio.h"
#include "stdlib.h"


int main(int argc, char** argv){
    if (argc != 2){
        printf("usage: ls dir_name\n");
        return 1;
    }

    DIR* dp = opendir(argv[1]);
    if (NULL == dp){
        printf("can't open %s\n", argv[1]);
        return 1;
    }

    printf("load dir success\n");

    struct dirent* dirp = NULL;
    while ((dirp = readdir(dp)) != NULL)
        printf("%s ", dirp->d_name);

    printf("\n");
    closedir(dp);

    return 0;
}

从结果看出来 . 和.. 的确是有效目录.打印结果是无序的.而ls结果是有序的.

exit(0)标示程序正常退出.1-255表示错误码.


1.5 输入和输出


fd是个非负整数.是内核用来标示特定进程正在访问的文件.

每当shell被打开,都有三个默认fd被打开:stdin stdout stderror

另外shell可以方便地重定向.

3)不用缓冲的IO

open read close write lseek 提供了不用缓冲的IO

代码:

#include "stdio.h"
#include "unistd.h"

int main(){
    int n = 0;
    const int maxLen = 4096;
    char buff[maxLen];

    while ((n == read(STDIN_FILENO, buff, maxLen)) > 0){
        if (write(STDOUT_FILENO, buff, n) != n){
            printf("error\n");
            exit(1);
        }
    }
    
    exit(0);
}

标示这代码不是很理解,明天来看.

就学到这里.