QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2158|回复: 10

父进程一定要等子进程结束再执行?

[复制链接]
发表于 2005-1-9 11:28:49 | 显示全部楼层 |阅读模式
我想实验进程的轮流执行,但是父进程总是等子进程结束了在执行,父进程没用wait,子进程执行时间也不短,应该满足时间片轮流了,这是为什么?谢谢
发表于 2005-1-9 15:23:42 | 显示全部楼层
你是怎样写的?
回复

使用道具 举报

 楼主| 发表于 2005-1-9 18:04:52 | 显示全部楼层

我用最简单的fork方法

if(fork()==0)
{for() printf(^^^)}
^^^^^父进程代码
请教
回复

使用道具 举报

发表于 2005-1-9 19:47:28 | 显示全部楼层
[code:1]
if(fork()==0)
{
       //子进程代码
}
else
{
        //父进程代码
}
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2005-1-10 09:58:19 | 显示全部楼层

从语法上,这两种不是差不多吗?

除了if(){child}是子进程的,外面的不还是父进程的代码吗?
顺便求证一下signal的第二个参数,那个要调用的函数,一定要是只有一个int参数的函数吗?
回复

使用道具 举报

 楼主| 发表于 2005-1-10 10:12:52 | 显示全部楼层

斑竹,你给的方法也不行啊!!

我把父进程代码用else括起来了,还是一样,没用阿,这进程是轮流执行的吗??唉
回复

使用道具 举报

发表于 2005-1-10 10:23:12 | 显示全部楼层
首先这个else括号有没有都一样, 外面的都是父进程。但是为什么子进程先执行完毕呢?这个或许就是操作系统的问题了, 操作系统或许先调度新创建的进程(这里是子进程)。还是printf是有缓冲的,所以你是不知道到底是父进程里面的printf先发后致还是子进程里面的Printf的结果后发先致。

略微猜测一番,你可以在printf后面加入一个fflush(stdout)看看后果
回复

使用道具 举报

 楼主| 发表于 2005-1-10 10:36:31 | 显示全部楼层

fflush没看出什么效果来

我的man有问题,查不了fflush,这函数啥作用啊。都是linux 操作系统难道调度策略什么的还有不一样,不会吧?
回复

使用道具 举报

发表于 2005-1-10 13:34:15 | 显示全部楼层
[code:1]
#include <stdio.h>

main()
{
    if(fork()==0)
    {
        sleep(1);
        printf("child\n");
    }
    else
    {
        printf("parent\n");
    }
}

[/code:1]

else有没有都一样?如果没有else将有两个"parent\n"被打印出来,一个是子进程打印的,一个是父进程,如果有else就只有一个打印出来,是在父进程里执行的.
至于从执行点开始,是子进程先执行还是父进程,我想那是fork的问题了,如果fork第一次返回值是0,那执行子进程就是理所当然了.我在子进程里加了一个延时,是为了让父进程先执行完.
回复

使用道具 举报

 楼主| 发表于 2005-1-10 19:07:38 | 显示全部楼层

提问

斑竹,在子进程里加sleep,或别的什么让进程暂停的方法,那别的进程获得执行,跟设想的让多进程自然情况下轮流进行,这不是不太一样么?
像java里明显看出进程是轮流执行的。
回复

使用道具 举报

发表于 2005-1-10 20:00:36 | 显示全部楼层
那好,想看轮流执行很简单
[code:1]
#include <stdio.h>
main()
{
        if(fork()==0)
        {
                int i,j;
                for(i=0;i<100;i++)
                {
                        for(j=0;j<9000000;j++)
                        {
                        }
                        printf("child %d\n",i);
                }
        }
        else
        {
                int i,j;
                for(i=0;i<100;i++)
                {
                        for(j=0;j<9000000;j++)
                        {
                        }
                        printf("parent %d\n",i);
                }
        }
}

[/code:1]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 19:34 , Processed in 0.036510 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表