开始接触Linux了,在网上查了一大堆资料,都说《Unix环境高级编程》是Linux界的“圣经”,那我就从这本书开始学吧。
该书的第一个程序即shell ls的实现就把我给难住了,因为头文件“apue.h”放在/usr/include/中还是会出错,在网上查了查资料,方法很麻烦,看着头晕,我这人就是有这毛病,怕麻烦。不过还好,找到一篇文章提供了一个简单方法,但是据说有个别的程序会出现重定义的情况,先就用这个方法配置吧,以后遇到问题再解决。方法如下:
1. 下载src.2e.tar.gz 网址:www.apuebook.com
2. 解压src.2e.tar.gz 在终端输入tar zxvf src.2e.tar.gz ,注意:src.2e.tar.gz应该放在当前目录下,我的是放在home下的
3. 进入解压文件apue.2e/include, 打开apue.h,在最后一行的#endif /* _APUE_H */前添加 #include "error.h" 保存
4. 将apue.h文件拷贝到/usr/include/下,在终端使用命令:sudo cp apue.2e/include/apue.h /usr/include/
5.将apue.2e/lib下的error.c文件拷贝到/usr/include/下 ,在终端使用命令:sudo cp apue.2e/lib/error.c /usr/include/
好,至此大功基本告成,我们来测试一下,书上的源代码如下:
#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); }
我用的是Emacs进行编译的,输入上述代码后,按Ctrl+s保存,然后按Esc+x进行命令输入,我们现在是要编译该程序,因此输入compile回车,然后输入gcc ls1.c回车。如出现如下提示,则编译成功,否则失败。
-*- mode: compilation; default-directory: "/home/cdj/CWorks/" -*- Compilation started at Wed Dec 4 15:37:15 gcc ls1.c Compilation finished at Wed Dec 4 15:37:15
编译成功后,就可以运行该程序了,再次按Esc+x,输入shell,然后输入 ./a.out /dev回车,得到结果如下:
cdj@ubuntu:~/CWorks$ ./a.out /dev . .. vsock dmmidi midi vmci fb0 lp0 parport0 vcsa6 vcs6 ...
接着输入书上的./a.out /var/spool/cron等命令。
至此,经过了大半天的折腾,终于跑起来了第一个程序。