实现ls命令[apue读书笔记]

[apue读书笔记] 实现ls命令

unix哲学 – 一切皆文件

apue的第一个例子就是实现一个简单的ls命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#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");
        //    printf("error");
    if((dp=opendir(argv[1]))==NULL)
        err_sys("can't open %s",argv[1]);
        //    printf("can't open %s",argv[1]);
    while((dirp=readdir(dp))!=NULL)
        printf("%s\n",dirp->d_name);
    closedir(dp);
    exit(0);
        

}

然后我们运行

1
>> gcc myls.c

这时候会出现错误 找不到apue.h的头文件

我们复制附录B中的头文件代码于当前目录。

然后重新运行,产生如下错误:

1
2
3
4
5
6
7
Undefined symbols for architecture x86_64:
  "_err_quit", referenced from:
      _main in myls-533805.o
  "_err_sys", referenced from:
      _main in myls-533805.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这里提示缺失_err_quit 和 _err_sys的二进制代码。

这个问题处理困扰了我好久,原因就是确实错误处理的库文件。

我们复制附录B中的error.c的错误处理代码。

先使用如下命令将其编译为二进制文件:

1
>> gcc -c error.c

产生新的文件 error.o

然后用ar命令打包这个link文件

1
>> ar -r liberror.a error.o

生成liberror.a的静态链接库文件

将连接库放入lib目标下

1
2
>> mkdir lib
>> mv liberror.a ./lib

然后使用如下命令编译

1
>>> gcc -L./lib -lerror myls.c -o myls.out

生成myls.out文件

1
./myls.out ./

可以获得当前目录文件信息

GCC编译指令 -L 指定库的路径-l 指定需连接的库名

opendir()用来打开参数name 指定的目录, 并返回DIR*形态的目录流。包含在#include

本文Github源码地址 :https://github.com/JohnDoe117/aque_learn/tree/main/chapter01