日期:2014-05-16  浏览次数:20714 次

unix中exec函数
int pid=0;
if(pid=fork()<0)
 status=-1;
else if(pid==0) /* child */
 {
  execl("/bin/sh","sh","-c","date",(char *)0);
  printf("can't go here\n");
  _exit(127);
 }
 else {
  while(waitpid(pid,&status,0)<0)
 {
  /*deal error*/
 }
}
我想问的是为什么到不了printf("can't go here\n"); execl函数 执行后 是直接结束进程吗? 只有出错的之后 才执行printf("can't go here\n");吗???
 

------解决方案--------------------
执行execl后,子进程(也就是else if(pid==0)的处理)
就被execl要执行的处理覆盖了,所以后面的代码就执行不到了吧。

出错的话不就异常了吗,也执行不到printf("can't go here\n");
------解决方案--------------------
没错,execl 失败_exit(127), 这个是一个习惯约定。system 函数就是这样的。
http://www.freebsd.org/cgi/man.cgi?query=system&apropos=0&sektion=0&manpath=FreeBSD+9.0-RELEASE&arch=default&format=html

探讨
哦 这样呀
我还有一点不明白,就是这段代码_exit(127);还有什么用吗?
是不是就是execl执行异常的时候 就执行_exit(127),返回给父进程退出状态码127??
我这么理解对吗?

------解决方案--------------------
新的程序在子进程的地址空间中从main开始执行,已经不关父进程代码的事了.
------解决方案--------------------
探讨

执行execl后,子进程(也就是else if(pid==0)的处理)
就被execl要执行的处理覆盖了,所以后面的代码就执行不到了吧。

出错的话不就异常了吗,也执行不到printf("can't go here\n");