敬业的IT人 >> 操作系统 >> Unix >> UNIX痛恨者手册:cpp预处理删文件机制

UNIX痛恨者手册:cpp预处理删文件机制

敬业的IT人 互联网 佚名 2008-4-22 22:55:45

    写一个程序, 例如a.c, 里边用了宏, 宏在别的目录下的头文件中定义, 用-I指定。

    调试时, 发现宏替换存在问题, 于是用cpp查看预处理输出, cpp也接受-I选项, 就象gcc一样。 于是, 故事开始了:

    1, cpp -I ……/headers/ a.c问题是, 我一下子忘了敲那个-I选项了!! 于是事实上的命令就是这样:cpp ……/headers/ a.c输出:cc1: error: headers/: 没有那个文件或目录

    2, 我马上意识到自己的错误操作, 更正为:cpp -I ……/headers/ a.c输出:[root@localhost ~]# cpp -I ……/headers/ a.c cpp: a.c:没有那个文件或目录cpp: 没有输入文件

    嗯? a.c也不见了? 不可能啊。 ls一下, 嘿, 还真的不见了! 百思不得其解, 用strace跟踪一下cpp ……/headers/ a.c,看看它都干了些什么:

    3, strace cpp ……/headers/ a.c最后几行的输出:

    QUOTE:vfork()                                 = 4450 waitpid(4450, cc1: error: headers/: 没有那个文件或目录[{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0) = 4450—— SIGCHLD (Child exited) @ 0 (0) ——stat64("a.c", {st_mode=S_IFREG|0644, st_size=0, ……}) = 0 unlink("a.c")                           = 0 exit_group(1)                           = ?    CODE:NAME cpp - The C Preprocessor

    SYNOPSIS cpp [-Dmacro[=defn]……] [-Umacro] [-Idir……] [-Wwarn……] [-M│-MM] [-MG] [-MF filename] [-MP] [-MQ target……] [-MT target……] [-P] [-fno-working-directory] [-x language] [-std=standard] infile outfile

    Only the most useful options are listed here; see below for the remain- der.如果你不输入 -I 的话,那么第一个参数 ……/headers/ 是输入文件,第二个参数 a.c 是输出文件。

    这样你的文件就会被删除。

    和 gcc -o ttt.c ttt 的原理一样,请看“UNIX痛恨者手册”,类似的还有

    CODE:rm *.o因为 * 号需要按 shift 键,所以如果你的手指不太协调或者键盘不太灵光的话,按后面的小数点的时候,也许 shift 还没有松开,于是就变成了

    CODE:rm *>o恭喜你!

    UNIX 将删除你所有的文件,并且为你生成一个名为 o 的空文件。

本U R L:
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com