免费注册 查看新帖 |

Chinaunix

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

fork()的子进程到底从哪里开始运行? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-29 09:14 |只看该作者 |倒序浏览
请先看例子,目的是2个进程(父,子)用信号量进行互斥打印。
我想弄清楚,fork()后,子进程到底从哪里开始执行。
如果按照书面理解,子进程是父进程的克隆,那么为什么只看到一个“Set sem init!\nBefore dowork()!”?谢谢
代码如下:
#include <semaphore.h>;
#include <stdio.h>;
#include <unistd.h>;
#include <errno.h>;

#define COUNT 10

sem_t g_sem;

void
dowork(void)
{

        pid_t child;
       
        if((child = fork()) == -1)
        {
                printf("Fork Error:%s\n", strerror(errno));
                exit(1);
        }else if(0 == child)
        {
                int i;
                for(i=0;i<COUNT;i++)
                {
                        sem_wait(&g_sem);
                        printf("Child#%d:Print----....\n", getpid());
                        sem_post(&g_sem);
                }
        }else
        {
                int i;
                for(i=0;i<COUNT;i++)
                {
                        sem_wait(&g_sem);
                        printf("Parent#%d:Print********\n", getpid());
                        sem_post(&g_sem);
                }
        }
       
}

int
main(void)
{
        sem_init(&g_sem,0,1);
        printf("Set sem init!\n");
        printf("Before dowork()!\n");
        dowork();
        printf("After dowork()!\n");
        return 1;
}

运行结果之一:
Set sem init!
Before dowork()!
Parent#3236:Print********
Parent#3236:Print********
Parent#3236:Print********
Parent#3236:Print********
Parent#3236:Print********
Parent#3236:Print********
Parent#3236:Print********
Parent#3236:Print********
Child#3296:Print----....
Child#3296:Print----....
Child#3296:Print----....
Child#3296:Print----....
Child#3296:Print----....Parent#3236:Print********
Parent#3236:Print********
After dowork()!

Child#3296:Print----....
Child#3296:Print----....
Child#3296:Print----....
Child#3296:Print----....
Child#3296:Print----....
After dowork()!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-07-29 09:25 |只看该作者

fork()的子进程到底从哪里开始运行?


  1. else if(0 == child)
  2. {
  3. int i;
  4. for(i=0;i<COUNT;i++)
  5. {
  6. sem_wait(&g_sem);
  7. printf("Child#%d:Print----....\n", getpid());
  8. sem_post(&g_sem);
  9. }
复制代码


fork函数 给父进程返回子进程的pid.给子进程返回0
你的else if(0 == child) 就判断了.

建议楼主这样的问题应当去看书.  或者看看精华帖子.

论坛徽章:
0
3 [报告]
发表于 2005-07-29 09:33 |只看该作者

fork()的子进程到底从哪里开始运行?

楼上说的意思我知道呀,我是想知道fork()出来的子进程从main()的第一个语句开始执行还是从哪里开始?比如说从fork()这句开始?
请指教!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-07-29 09:36 |只看该作者

fork()的子进程到底从哪里开始运行?

>;>;else if(0 == child)
子进程
从这句 开始的.

你不是说你知道了吗?

论坛徽章:
0
5 [报告]
发表于 2005-07-29 09:46 |只看该作者

fork()的子进程到底从哪里开始运行?

我意思我知道你说的“给父进程返回子进程的pid.给子进程返回0
你的else if(0 == child) 就判断了. ”
从结果也说明从fork()开始,否则"Set sem init!\nBefore dowork()!”要打印2遍了。
你之前说的fork()这个简明的答案,我开始没有确定你的意思,故确认了一下,谢谢!
那么从fork()开始,所有父,子进程能执行的语句(指令)都一样了(有意通过fork()返回值来判断做不同的父子工作除外)?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-07-29 09:49 |只看该作者

fork()的子进程到底从哪里开始运行?

>;>;所有父,子进程能执行的语句(指令)都一样了(有意通过fork()返回值来判断做不同的父子工作除外)?

括号里的语句我没读懂.

论坛徽章:
0
7 [报告]
发表于 2005-07-29 10:07 |只看该作者

fork()的子进程到底从哪里开始运行?

我真没见过父子完全做一样的工作的程序,孤陋寡闻,觉得肯定有那样的东西;

论坛徽章:
0
8 [报告]
发表于 2005-07-29 10:48 |只看该作者

fork()的子进程到底从哪里开始运行?

int
main(void)
{
        int i;
        pid_t childpid;
       
        fprintf(stderr, "Before dowork()!\n";
        for(i=0;i<2;i++)
        {
                if(childpid=fork())
                {
                        fprintf(stderr, "arent:[i=%d]-->;[Process=%d]-->;[Parent=%d]-->;[Child=%d]\n",
                                i,getpid(),getppid(),childpid);
                        break;
                }
                fprintf(stderr, "Child:[i=%d]-->;[Process=%d]-->;[Parent=%d]-->;[Child=%d]\n",
                        i,getpid(),getppid(),childpid);
        }
        fprintf(stderr, "After dowork()!\n";
        return 1;
}
运行结果:
inc031230@INC031230 /work/LibTest
$ ./semaphore.out
Before dowork()!
Parent:[i=0]-->;[Process=5924]-->;[Parent=968]-->;[Child=5972]
After dowork()!
Child:[i=0]-->;[Process=5972]-->;[Parent=1]-->;[Child=0]

inc031230@INC031230 /work/LibTest
$ Parent:[i=1]-->;[Process=5972]-->;[Parent=1]-->;[Child=5968]
After dowork()!
Child:[i=1]-->;[Process=5968]-->;[Parent=1]-->;[Child=0]
After dowork()!
注意!:以上看上去2次输出,是一次运行的结果。
请帮忙解释一下为什么结果是这样。谢谢!
我没有看懂的地方是,1)为什么会有2次Parent输出。fork()出来的都是子进程呀?我开始估计总共要输出3次(fork()2次,2个子进程分别输出,原来的父进程1次);2)为什么会运行一次,结果2次输出?
ps:上个括号里的问题请你不用考虑了,我没有思考清楚。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2005-07-29 10:51 |只看该作者

fork()的子进程到底从哪里开始运行?

原帖由 "mq110" 发表:
>;>;else if(0 == child)
子进程
从这句 开始的.

你不是说你知道了吗?

错了,是从 fork 的下一句开始执行。
也就是从 if () 那句开始执行。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2005-07-29 10:51 |只看该作者

fork()的子进程到底从哪里开始运行?

>;>;if(childpid=fork())

这句 只在fork执行成功以后 运行.
当然父子进程都会有的.

给楼主的建议就是去看书.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP