免费注册 查看新帖 |

Chinaunix

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

fork的一个例子,好像人家是讲得很详细了,我还是不明白 [复制链接]

论坛徽章:
0
101 [报告]
发表于 2007-06-21 15:44 |只看该作者
有兄弟说在if以后的代码是父进程和子进程都会执行的,但是我试验的时候,却没有呢????
头文件省略
int Print(char * out)
{
   if(NULL == out)
     return -1;
  while(1)
    {
       printf("out is %s and pid is %d\n",out , getpid());
       sleep(1);
    }

}
int main(void)
{
  pid_t newpid;
  printf("Hello\n");
  newpid = fork();
  if(newpid==0)
   {
     printf("Son is run!\n");
     Print("son");
   }
  else if(newpid>0){
    printf("my son is %d\n",newpid);
  }else if(newpid <0){
     printf("fork fail!\n");
     exit(-1);
   }


  while(1)
{
    printf("The thread is running!pid is %d\n",getpid());
    sleep(1);
   }

}

执行的是这样的:
  Hello
   my son is 7123
  The thread is running!pid is 7122
  Son is run!
  out is son and pid is 7123
The thread is running!pid is 7122
  out is son and pid is 7123
The thread is running!pid is 7122
   ...................
这里为什么总是父进程在执行“The thread is。。。”,而子进程不执行呢?

论坛徽章:
0
102 [报告]
发表于 2007-06-23 20:59 |只看该作者
fork后的二个进程是同时向后执行的。

论坛徽章:
0
103 [报告]
发表于 2007-06-24 09:39 |只看该作者
看晕了!

论坛徽章:
0
104 [报告]
发表于 2007-06-25 15:36 |只看该作者
确实是简单而经典的例子

论坛徽章:
0
105 [报告]
发表于 2007-06-25 17:53 |只看该作者
fork是叉子的意思:em11: 程序分成2股拉

论坛徽章:
0
106 [报告]
发表于 2007-06-26 19:12 |只看该作者
学到好多东西~

论坛徽章:
0
107 [报告]
发表于 2007-08-18 19:44 |只看该作者
看了此贴从清晰到很晕
借贴问个问题,vfork()之后,要等子进程用exec后才能运行父进程,那和顺序执行有什么区别?并发的优势怎么体现?

我是想接收到网络上的1个包以后开个子进程让它去把包发到串口,而父进程继续接受下一个包
因为串口发送慢,如果顺序执行的话,网络接受上可能丢包


PS:我的uclinux好象只能用vfork()

[ 本帖最后由 marco_hxj 于 2007-8-18 19:45 编辑 ]

论坛徽章:
0
108 [报告]
发表于 2007-08-18 20:41 |只看该作者
那和顺序执行有什么区别?

你说的顺序是什么?

你的数据包的平均速度大于串口的速度,那么肯定是会失败了,

否则多线程就可以了,或者用个管道什么的就可以,用select返回能写就写,否则父进程保留收到的包。

论坛徽章:
0
109 [报告]
发表于 2007-08-18 21:36 |只看该作者
ls的,我现在是这样做的
while(1)
{
   recvfrom;
  串口发送;//这里比如需要0.1s,
}
在这0.1s内还有网络数据过来,就接收不到了
所以我想
vfork一个子进程去发送,父进程继续接收网络,但是父进程要等子进程完成才运行,那和我上面的做法好象没区别


父子进程如果能够同时进行的话,我开3个包的缓冲,这个速度应该可以匹配了

PS:希望我的问题不要污染了这帖子

[ 本帖最后由 marco_hxj 于 2007-8-18 21:48 编辑 ]

论坛徽章:
0
110 [报告]
发表于 2007-08-18 21:53 |只看该作者
thread1:
    recvfrom and add this packet to buf (if buf is full, discard this packet);

thread2
    if buf is not empty, send packet

而且recvfrom有缓冲,不会因为你0.1S不读就丢包,不过这个缓冲比起自己的缓冲来说很小
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP