设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
编程开发讨论区 —— LinuxSir.cn
›
Linux 程序设计专题讨论
›
[c]关于fork()前后进程的运行
1
2
3
4
5
6
/ 6 页
下一页
返回列表
楼主:
colored
[c]关于fork()前后进程的运行
[复制链接]
libinary
libinary
当前离线
积分
1502
IP卡
狗仔卡
发表于 2003-6-13 14:23:21
|
显示全部楼层
case里面别忘了加exit(0),否则第一个子进程会继续循环,再创建一个子进程。
回复
支持
反对
使用道具
举报
显身卡
0100
0100
当前离线
积分
478
IP卡
狗仔卡
发表于 2003-6-15 15:55:52
|
显示全部楼层
你再看看我的源代码:
#include <unistd.h>
#include <stdio.h>
main()
{
int i,j;
int pid1,pid2;
for(i=0;i<2;i++)
{
switch (i)
{
case 0:{if((pid1=fork())==-1) perror("fork error!");
else
if(pid1==0)
printf("This is the first procedure!\n");
exit(0);break;}
case 1:{if((pid2=fork())==-1) perror("fork error!");
else
if(pid2==0)
printf("This is the second procedure!");
exit(0);break;}
}
}
}
复制代码
但运行后,只有一个This is the first procedure!
怎么回事啊?第二个怎么没有打印出来呢?
回复
支持
反对
使用道具
举报
显身卡
libinary
libinary
当前离线
积分
1502
IP卡
狗仔卡
发表于 2003-6-15 17:50:55
|
显示全部楼层
if(pid1==0)
printf("This is the first procedure!\n");
exit(0);
复制代码
应该是:
if(pid1==0){
printf("This is the first procedure!\n");
exit(0);
}
复制代码
否则父进程和子进程运行到exit(0)都结束了。
回复
支持
反对
使用道具
举报
显身卡
0100
0100
当前离线
积分
478
IP卡
狗仔卡
发表于 2003-6-15 20:23:11
|
显示全部楼层
我真笨啊。我只知道冬天是没有^^^^^^
没想到居然是这么笨的错误。
回复
支持
反对
使用道具
举报
显身卡
kj501
kj501
当前离线
积分
5317
IP卡
狗仔卡
发表于 2003-6-15 21:02:08
|
显示全部楼层
楼上的兄弟应该学会调试程序,用gdb跟踪一下就很清楚了。
回复
支持
反对
使用道具
举报
显身卡
colored
colored
当前离线
积分
158
IP卡
狗仔卡
楼主
|
发表于 2003-6-15 21:05:47
|
显示全部楼层
也写一段代码
#define NUM 3
int main()
{
pid_t pid[NUM],cpid;
int i;
for(i=0;i<NUM;i++)
pid[i]=(pid_t) 0;
pid[0]=getpid()://父进程
for(i=1;i<NUM;i++)
{
if((cpid=fork())==-1);//子进程
{
pritf("fork error!");
exit(1);
}
else
if(cpid==0)
{
pid[i]=getpid();
break;
}
else
continue;
}
cpid=getpid();
switch(cpid)
{
case pid[0]://父进程
//write your code
break;
case pid[1]://子进程1
//....
break;
case pid[2]://子进程2
//....
break;
}
}
复制代码
回复
支持
反对
使用道具
举报
显身卡
libinary
libinary
当前离线
积分
1502
IP卡
狗仔卡
发表于 2003-6-15 21:24:38
|
显示全部楼层
回复: 也写一段代码
这段代码有问题
#define NUM 3
int main()
{
pid_t pid[NUM],cpid;
int i;
pid[0]=getpid()://父进程
for(i=1;i<NUM+1,i++) [color=red]/* 不应该是NUM+1,应该是NUM,否则就成了i<4,
* 当i=3的时候还要进行循环 */[/color]
pid[i]=fork();//子进程 [color=red]/* 父进程第一次fork产生了子进程一,再次循环的时候,
* 父进程产生子进程二,而子进程一也产生了一个子子进程 */[/color]
cpid=getpid();
switch(cpid)
{
case pid[0]://父进程
//write your code
break;
case pid[1]://子进程1
//....
break;
case pid[2]://子进程2
//....
break;
}
}
复制代码
回复
支持
反对
使用道具
举报
显身卡
colored
colored
当前离线
积分
158
IP卡
狗仔卡
楼主
|
发表于 2003-6-15 21:31:14
|
显示全部楼层
已经看出来了
正在改正ing
回复
支持
反对
使用道具
举报
显身卡
colored
colored
当前离线
积分
158
IP卡
狗仔卡
楼主
|
发表于 2003-6-15 21:33:04
|
显示全部楼层
改正完毕
请指正
回复
支持
反对
使用道具
举报
显身卡
libinary
libinary
当前离线
积分
1502
IP卡
狗仔卡
发表于 2003-6-15 21:38:20
|
显示全部楼层
第一个问题可以看一下《C陷阱与缺陷》第三章,有一段讲“不对称边界”的,讲的非常好。
第二个问题主要要搞清楚fork调用以后进程的状况(我主要从代码的角度来讲),此时有父子两个进程,他们的代码是一样的,变量的值也一样,运行的位置也一样(fork之后),比如你的代码,此时父子进程的i都等于1,都满足循环条件,所以,父子进程都要继续循环继续fork,各产生一个子进程。
一般在fork之后用if(pid == 0)就是为了把父子进程的执行路径分开。
回复
支持
反对
使用道具
举报
显身卡
下一页 »
1
2
3
4
5
6
/ 6 页
下一页
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表