刚学UNIX编程,请教一个简单问题

elssann 2004-03-24 05:51:44
void main(void)
{
char buf[MAXLINE];
pid_t pid;
int status;

printf("%%");
while (fgets(buf, MAXLINE, stdin != NULL))
{
buf[strlen(buf)-1] = 0;
}


if ((pid=fork()) < 0)
{
err_sys("fork err");
}

else if (pid == 0)
{
execlp(buf, buf, (char*)0);
err_ret("couldn't execute: %s", buf);
exit(127);
}
if ((pid=waitpid(pid, &status, 0)) < 0)
{
err_sys("waitpid err");
printf("%%");
}

exit(0);
}

上面这段程序就我个人理解,执行后会有三个进程,第一个进程就是第一次执行的时候产生的,然后用fork复制了一个进程本身是第二个进程。然后在第二个进程里用execlp产生了第三个进程。。。不知道我理解对不对?
另外,fork对第一个进程返回ProcessID,对第二个进程返回0,对吗?
我还有个疑问就是:当第一个进程执行到fork那条语句的时候,书上说是复制了进程本身,这个复制到底是什么概念?复制的新进程从什么地方开始执行?从程序最开始执行吗?那岂不是新复制的进程又要执行一次fork?或者是从fork那条语句之后开始执行?
最后一个疑问就是根本没有对execlp的返回值进行判断,就直接输出couldn't execute,为什么?

谢谢,我是UNIX新手,请各位多帮助。分数不多。
...全文
79 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
vctony 2004-03-24
  • 打赏
  • 举报
回复
fork就是会产生一个新进程,但会有参数让你控制产生的新进程是做为子进程运行,还是做为线程,或完全剥离于父进程,EXEC系列的函数是用新的执行映射去替换FORK出来的新进程的内存空间的。
elssann 2004-03-24
  • 打赏
  • 举报
回复
哦,谢谢!

那么fork的调用呢?
请各位高手再来指点啊
rexp 2004-03-24
  • 打赏
  • 举报
回复
exec系列的调用是不会产生新的进程的。
会替换原进程的环境,然后运行。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧