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

在第二章的程序清单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 void	pr_sysconf(char *, int);\n")
	printf("static void	pr_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("\tlong	val;\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("\tlong	val;\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")
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值