APUE读书笔记(0.2) ——APUE源代码中的awk脚本文件

来源:互联网 发布:网络推广策划书范文6篇 编辑:程序博客网 时间:2024/06/09 23:50

在第二章的程序清单2-1中,第一次出现了一个.awk文件,一开始对这个文件一头雾水,后来百度了一下,awk是用于在linux/unix下对文本和数据进行处理。它处理的数据可以来自标准输入、一个或多个文件,或其它命令的输出。关于awk的更多细节,可以查阅(http://man.lupaworld.com/content/manage/ringkee/awk.htm)。


知道了这一点,剩下的就是怎么运行文件了,首先需要修改一下文件,具体的方法是:

1、使用 whereis awk查看本机的awk位置,例如我的是/usr/bin/awk;


2、在源代码的.awk脚本中添加一行:

       #!/usr/bin/awk -f 

       其中/usr/bin/awk是第一步的awk位置,-f表示awk读取文件数据,


这样就能运行了,运行的结果是一个C程序,为什么要用awk脚本来写一个C程序呢?

因为程序清单2-1的目的是查看本机支持的系统配置限制,但是不同标准有不同的参数,如果将这些参数写死到一个C程序里面,以后再更新就很麻烦了,因此作者将这些参数放到两个数据文件中(sysconf.sym 和 pathconf.sym),用脚本来读取这个数据文件,进而生成查询相应配置的C代码,一样以来程序就和数据解耦了,这体现了设计模式里面的高内聚、低耦合的优点。


最后附上完整的程序清单2-1

#!/usr/bin/awk -f BEGIN{printf("#include \"apue.h\"\n")printf("#include <errno.h>\n")printf("#include <limits.h>\n")printf("\n")printf("static voidpr_sysconf(char *, int);\n")printf("static voidpr_pathconf(char *, char *, int);\n")printf("\n")printf("int\n")printf("main(int argc, char *argv[])\n")printf("{\n")printf("\tif (argc != 2)\n")printf("\t\terr_quit(\"usage: a.out <dirname>\");\n\n")FS="\t+"while (getline <"sysconf.sym" > 0) {printf("#ifdef %s\n", $1)printf("\tprintf(\"%s defined to be %%d\\n\", %s+0);\n", $1, $1)printf("#else\n")printf("\tprintf(\"no symbol for %s\\n\");\n", $1)printf("#endif\n")printf("#ifdef %s\n", $2)printf("\tpr_sysconf(\"%s =\", %s);\n", $1, $2)printf("#else\n")printf("\tprintf(\"no symbol for %s\\n\");\n", $2)printf("#endif\n")}close("sysconf.sym")while (getline <"pathconf.sym" > 0) {printf("#ifdef %s\n", $1)printf("\tprintf(\"%s defined to be %%d\\n\", %s+0);\n", $1, $1)printf("#else\n")printf("\tprintf(\"no symbol for %s\\n\");\n", $1)printf("#endif\n")printf("#ifdef %s\n", $2)printf("\tpr_pathconf(\"%s =\", argv[1], %s);\n", $1, $2)printf("#else\n")printf("\tprintf(\"no symbol for %s\\n\");\n", $2)printf("#endif\n")}close("pathconf.sym")exit}END{printf("\texit(0);\n")printf("}\n\n")printf("static void\n")printf("pr_sysconf(char *mesg, int name)\n")printf("{\n")printf("\tlongval;\n\n")printf("\tfputs(mesg, stdout);\n")printf("\terrno = 0;\n")printf("\tif ((val = sysconf(name)) < 0) {\n")printf("\t\tif (errno != 0) {\n")printf("\t\t\tif (errno == EINVAL)\n")printf("\t\t\t\tfputs(\" (not supported)\\n\", stdout);\n")printf("\t\t\telse\n")printf("\t\t\t\terr_sys(\"sysconf error\");\n")printf("\t\t} else {\n")printf("\t\t\tfputs(\" (no limit)\\n\", stdout);\n")printf("\t\t}\n")printf("\t} else {\n")printf("\t\tprintf(\" %%ld\\n\", val);\n")printf("\t}\n")printf("}\n\n")printf("static void\n")printf("pr_pathconf(char *mesg, char *path, int name)\n")printf("{\n")printf("\tlongval;\n")printf("\n")printf("\tfputs(mesg, stdout);\n")printf("\terrno = 0;\n")printf("\tif ((val = pathconf(path, name)) < 0) {\n")printf("\t\tif (errno != 0) {\n")printf("\t\t\tif (errno == EINVAL)\n")printf("\t\t\t\tfputs(\" (not supported)\\n\", stdout);\n")printf("\t\t\telse\n")printf("\t\t\t\terr_sys(\"pathconf error, path = %%s\", path);\n")printf("\t\t} else {\n")printf("\t\t\tfputs(\" (no limit)\\n\", stdout);\n")printf("\t\t}\n")printf("\t} else {\n")printf("\t\tprintf(\" %%ld\\n\", val);\n")printf("\t}\n")printf("}\n")}


原创粉丝点击