当前位置:Linux教程 - Linux资讯 - UNIX痛恨者手册:cpp预处理删文件机制

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

    写一个程序, 例如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_IFREG0644, 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 的空文件。

(出处:http://www.sheup.com)