免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1357 | 回复: 5
打印 上一主题 下一主题

一个fork的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-03 15:30 |只看该作者 |倒序浏览
小弟初学fork对下面这个程序的运行流程不是太理解,请高手帮忙:
#define                MAXLINE                512
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)
                        printf("for error";
                else if(pid==0){
                        execlp(buf,buf,(char *)0);
                        printf("couldn't execute: %s",buf);
                        exit(127);
                        }
                if((pid=waitpid(pid,&status, 0 ))<0)
                        printf("waitpid error";
                printf("##";
                }
        exit(0);
}


这是一个产生循环的输入命令,并产生输出的程序;
但让我产生两个疑问:
1:
while(fgets(buf,MAXLINE,stdin) !=NULL){
                buf[strlen(buf)-1]=0;
execlp(buf,buf,(char *)0);
}
这样写就不能实现循环;输入一次就退出了;请问上面的程序循环是在那控制的?
2:fgets(buf,MAXLINE,stdin)   中的stdin是什么意思?屏幕标准输入吗?

谢谢

论坛徽章:
0
2 [报告]
发表于 2004-09-03 16:41 |只看该作者

一个fork的问题

楼主,父进程一直在while循环中呢

论坛徽章:
0
3 [报告]
发表于 2004-09-03 17:31 |只看该作者

一个fork的问题

但是我这么写:
while(fgets(buf,MAXLINE,stdin) !=NULL){
buf[strlen(buf)-1]=0;
execlp(buf,buf,(char *)0);
}
怎么就不循环了啊, 我不太明白你的意思!

论坛徽章:
0
4 [报告]
发表于 2004-09-03 20:33 |只看该作者

一个fork的问题

exec系列函数会将参数中指定的程序加载到当前的进程环境中,然后将控制传递给该目标程序的main函数,当然exec 函数的另外参数就是main的argv。exec 只是改变当前进程环境中的程序映像,不会改变进程的其他属性(除了set-uid标志被清除)。此函数成功,则用不返回到调用的那个点上,失败则返回-1。
所以,循环里放exec 本身逻辑就是错误。

论坛徽章:
0
5 [报告]
发表于 2004-09-03 21:25 |只看该作者

一个fork的问题

exec系列函数会把整个进程的代码段替换,因此,是不会执行其他的东西的~

论坛徽章:
0
6 [报告]
发表于 2004-09-06 11:11 |只看该作者

一个fork的问题

1:execlp(buf,buf,(char *)0); 这个函数起到什么作用,我对这方面的以前没接触过,  (char *)0  这个参数是什么意思?

2:‘exec 只是改变当前进程环境中的程序映像,不会改变进程的其他属性‘
这句话是什么意思?   是调用主程序的逻辑循环吗? 是不是exec函数如果实现循环不能出现在循环里,只能通过子函数来控制?
3:’循环里放exec 本身逻辑就是错误‘ 但是开始的那种方式也是放在循环里的啊, 就能实现我想要得,

while(fgets(buf,MAXLINE,stdin) !=NULL){
buf[strlen(buf)-1]=0;
execlp(buf,buf,(char *)0);
}
这样就不行!
谢谢,各位的帮助
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP