免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: naker
打印 上一主题 下一主题

UNIX系统编程(10月11号更新 1楼,2楼,11楼,20楼,53楼,54楼) [复制链接]

论坛徽章:
0
1 [报告]
发表于 2006-11-07 12:50 |显示全部楼层
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
        static      char prompt[64]="> ";
        char    command[256];
        int   st;
        fprintf(stderr,"%s",prompt);    //  屏幕上的输出提示符
        while(gets(command)!=NULL)  //  取得键盘输入
        {
                if(fork()==0)     //  生成子进程
                {         //  子进程要做的事
                       execl(command,command,(char *)0)==-1        //执行所输入的命令
                }
                else
                {         //  父进程要做的事
                        wait(&st);  //  等待子进程结束
                        fprintf(stderr,"%s",prompt);  //  输出提示符,等待命令
                 }
        }
        return 0;
}




fork有个问题一直不明白,就是在循环中调用fork函数,在for中调用时,如果不加exit函数,会产生递归调用,产生第三层或更高层的子进程,在while中没有试过。

楼主的程序会不会产生同样的问题?
谢谢!!

论坛徽章:
0
2 [报告]
发表于 2006-11-07 20:20 |显示全部楼层
原帖由 naker 于 2006-11-7 19:25 发表

应该是不会的,别看没有exit,但我调用的是exec。你看了我上面的帖子就知道了,exec把它后面的东西都覆盖掉了,就算写了也白写,这是一。二,本质上说exec又被你调动的程序代替,所以不用担心。程序都写好了,你 ...




程序如下:
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
        pid_t pid;
        int i;

        for(i=0;i<3;i++)
        {
                if( (pid=fork()) < 0)
                        fprintf(stdout, "fork error on %d\n",i);
                else if( pid > 0)
                        printf("parent fork  %d\n",i);
                else
                        
                        printf("child fork %d\n", i);
        }
        
        exit(0);
}
执行结果:
parent fork  0
child fork 0
parent fork  1
parent fork  1
child fork 1
parent fork  2
parent fork  2
parent fork  2
child fork 1
parent fork  2
child fork 2
child fork 2
child fork 2
child fork 2
初步分析:
第一层循环3次i=0,1,2)
parent fork  0
parent fork  1
parent fork  2
child fork 0(进程1,初始i=0)
child fork 1(进程2,初始i=1)
child fork 2(进程3,初始i=2)
第二层进程1循环2次i=1,2)
parent fork  1
parent fork  2
child fork 1(进程4,初始i=1)
child fork 2(进程5,初始i=2)
第二层进程2循环1次i=2)
parent fork  2
child fork 2(进程6,初始i=2)
第三层进程4循环1次i=2)
parent fork  2
child fork 2(进程7,初始i=2)



这个问题不知道是不是你所说的没有等待的原因,我现在没有环境,所以没试验!
如果在之进程中写exit的话,程序就不会产生孙子进程了。
另外还有就是:

int main()
{
        pid_t pid;
        int i = 0;
        printf("asfsda\n");
     for(i=0;i<3;i++)
        while(1)        
        {      
                if( (pid=fork()) < 0)
                        fprintf(stdout, "fork error on %d\n",i);
                else if( pid > 0)
                        printf("parent fork  %d\n",i);
                else   
                {      
                    printf("child fork %d\n", i);
                  //exit(0);   //不明白的地方
                }      
        }      
        
        return(0);
}
(1)加exit(0);结果:
asfsda
parent fork  0
parent fork  1
child fork 0
child fork 1
child fork 2
parent fork  2
不加exit(0);结果:
asfsda
parent fork  0
parent fork  1
parent fork  2
child fork 0
parent fork  1
child fork 1
parent fork  2
child fork 1
parent fork  2
parent fork  2
child fork 2
child fork 2
child fork 2
child fork 2

这里我就不明白了,为什么子进程没有执行printf("asfsda\n");而是从for开始执行呢?是fork函数对循环作特殊处理了吗?


你说exec后面都覆盖掉了,但是如上面的程序,如果没加exit,也没有exec函数,怎么printf("asfsda\n");在孙子进程中就没有执行呢?

能解答一下吗?
谢谢!!

论坛徽章:
0
3 [报告]
发表于 2006-11-08 09:45 |显示全部楼层
原帖由 naker 于 2006-11-7 21:52 发表

你的第一个程序,没加exit,也没有exec函数,子进程执行完else,按父进程代码继续往下走。
第二个程序,子进程从fork分叉的那一点开始往下执行,fork上面的是不执行的。



我有把程序改了一下,
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    pid_t pid;
    int i = 0;
    printf("asfsda\n");
    for(i=0;i<3;i++)
    //while(1)        
    {      
        printf("%d  pid = %d\n", i, getpid());
        if( (pid=fork()) < 0){
            fprintf(stdout, "fork error on %d\n",i);
        }else if( pid > 0){
            printf("parent fork  %d pid = %d\n", i, getpid());
        }else{      
            printf("child fork %d  pid = %d\n", i, getpid());
            //exit(0);   //不明白的地方
        }      
    }      
    return(0);
}

结果:
asfsda
0  pid = 25141
child fork 0  pid = 25142
1  pid = 25142
parent fork  0 pid = 25141
1  pid = 25141
child fork 1  pid = 25143
2  pid = 25143
parent fork  1 pid = 25142
2  pid = 25142
child fork 2  pid = 25146
parent fork  2 pid = 25142
child fork 1  pid = 25144
2  pid = 25144
parent fork  1 pid = 25141
2  pid = 25141
child fork 2  pid = 25148
parent fork  2 pid = 25141
child fork 2  pid = 25145
parent fork  2 pid = 25143
child fork 2  pid = 25147
parent fork  2 pid = 25144


打印pid 和打印parent 的数目一样多,也就是说子进程是从 for(i=0;i<3;i++)往下执行的,
那么是不是说在没有exit或exec(也就是没有终止或被覆盖)的情况下,
1。无循环:子进程执行分支下的语句。
2。有循环:子进程执行循环里的语句,而不是fork分支里的语句?
这是不是fork对循环的特殊处理?

至于exit和_exit的关系,不是太清楚,

http://bbs.chinaunix.net/viewthread.php?tid=62916

里也有讨论,我看我们公司里这方面的程序,也是用的exit,
没出现什么问题呀!

期待中!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP