分类: LINUX
2010-05-18 21:29:12
先看例程8.10(exec2.c)
|
编译例程
$ gcc –o exec2 exec2.c
在testinterp文件中输入如下内容
$ cat > testinterp
#! /home/yao/work/myAPUE/ch08/echoarg foo
EOF(Ctrl+D)
$chmod u+x testinterp
echoarg.c的文件内容如下:
|
编译例程echoarg.c
$ gcc –o echoarg echoarg.c
最后运行./exec2
$ ./exec2
argv[0]: /home/yao/work/myAPUE/ch08/echoarg
argv[1]: foo
argv[2]: /home/yao/work/myAPUE/ch08/testinterp
argv[3]: myarg1
argv[4]: MY ARG2
这个到目前为止都比较好理解。比较有意思的是当你运行testinterp文件时候出现的第三个参数”./testinterp”
$ ./testinterp
agv[0]: /home/yao/work/myAPUE/ch08/echoarg
argv[1]: foo
argv[2]: ./testinterp
因为在Shell处理脚本文件时,会调用fork、exec和wait函数(手记06之shell如何执行脚本),和程序exec2.c一样用d调用了execl函数,首先,execl函数对#!行分析后得出此脚本的解释器为”/home/yao/work/myAPUE/ch08/echoarg”,然后就形成了把命令行处理成了:”/home/yao/work/myAPUE/ch08/echoarg foo ./testinterp”。