为防止以后忘记,我把这张图[2]放在下面,也为后来者提供一些方便,这张图很清晰地讲解了dup,dup2以及管道的一些知识。想了解更详细的相关知识可以参考文章末尾的参考列表。
FAQ:为啥要再开一个进程来跑grep -v usr /etc/passwd ?父进程不也可以执行吗?
A:啊蚂蚁!在执行了execlp("/bin/grep", "grep", "-v", "usr","/etc/passwd", NULL);后,程序就会exit(0)了,如果是父进程在执行,那么父进程就退出了,因此要在execlp执行完成后继续执行,就必须f**k一个子进程出来,用子进程来运行execlp,好让老爹活着继续生娃。其他地方也是一样的。
FAQ:这段程序有没有考虑僵尸进程活着孤儿进程的情况啊?
A:没有。。 ( ̄ε(# ̄)。。让它们去吧。。。僵尸和孤儿们就交给init老大照看了。。。
PS:必须吐槽一下这道题的提示。给出exec的用法还不如告诉execlp的原型;dup2的用法提示还是错的,或者说有误导作用,明明是将第二个参数重定向到第一个参数,结果它的参数的意思是从dst到src,我的英语一般,但是dst是destination,src是source,我还是知道的,提示起到了南辕北辙的作用;等待子进程结束就更加坑爹了,直接告诉做题者用wait(NULL);不就行了。
说白了,这个提示,懂的人不看也懂,不懂的人看了也不懂。