免费注册 查看新帖 |

Chinaunix

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

父子进程要同时写一个文件,是双方交叉完成,还是子进程自己完成的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-10 13:54 |只看该作者 |倒序浏览
小弟最近正在学习linux下的c语言编程,在网上搜到一个关于多进程的例子,如下:

父进程和子进程要分别独立地调用 rdwrt 函数,并执行一个循环,即从源文件中读一个字节,然后写一个字节到目标文件中区。当系统调用 read 遇见文件尾时,函数 rdwrt 立即返回。

#include <fcntl.h>

int fdrd, fdwt;
char c;

main(int argc, char *argv[])
{
if (argc != 3) {
exit(1);
}
if ((fdrd = open(argv[1], O_RDONLY)) == -1) {
exit(1);
}
if ((fdwt = creat(argv[2], 0666)) == -1) {
exit(1);
}

fork();
// 两个进程执行同样的代码
rdwrt();
exit(0);
}

rdwrt()
{
for (; {
if (read(fdrd, &c, 1) != 1) {
return ;
}
write(fdwt, &c, 1);
}
}  


按道理讲子进程共享父进程的打开的文件描述符,两个进程共同完成对文件的复制。
但我自己在rdwrt函数中添加了打印信息的语句 ,修改后的程序如下

#include <fcntl.h>

int fdrd, fdwt;
char c;
int cid;// 自己添加的部分

main(int argc, char *argv[])
{
if (argc != 3) {
exit(1);
}
if ((fdrd = open(argv[1], O_RDONLY)) == -1) {
exit(1);
}
if ((fdwt = creat(argv[2], 0666)) == -1) {
exit(1);
}

cid=fork();//自己修改的地方
// 两个进程执行同样的代码
rdwrt();
exit(0);
}

rdwrt()
{
for (; {
if(cid==0)
printf("1/";
else
printf("0/";
if (read(fdrd, &c, 1) != 1) {
return ;
}
write(fdwt, &c, 1);
}

程序运行结果显示所有的复制操作全是由子进程完成的 颇为疑惑,不应该是两者交叉的吗

[ 本帖最后由 cc007c 于 2007-4-10 13:56 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-04-12 10:35 |只看该作者
应该是子进程先执行,到父进程执行时,文件已经拷贝完了。。。加个sleep试试看。

论坛徽章:
0
3 [报告]
发表于 2007-04-12 13:53 |只看该作者
比试速度吧,这样读写数据难道就不会出问题?
我认为结果是不可以预料的.

论坛徽章:
0
4 [报告]
发表于 2007-04-12 19:29 |只看该作者
高手解答一下行么?
另外我想问任何一个进程,无论是父 还是 子进程 返回到主函数时,遇到exit(0),那会不会等另一个进程返回主函数的exit(0)才推出程序呢?

论坛徽章:
0
5 [报告]
发表于 2007-04-13 11:16 |只看该作者

回复 #1 cc007c 的帖子

一般来说是FORK以后,子进程优先运行,在这个例子中,拷贝的内容少,所以子进程已经执行好了,父进程没什么事情干.子进程EIXT0,就返回父进程了,父进程EXIT0,感觉是想把子进程变守护进程了, 感觉我在误人子弟啊.汗

[ 本帖最后由 toxink 于 2007-4-13 11:17 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-04-13 13:07 |只看该作者
原帖由 toxink 于 2007-4-13 11:16 发表于 5楼  
一般来说是FORK以后,子进程优先运行,在这个例子中,拷贝的内容少,所以子进程已经执行好了,父进程没什么事情干.子进程EIXT0,就返回父进程了,父进程EXIT0,感觉是想把子进程变守护进程了, 感觉 ...

子进程exit(0)整个程序不就完结了么?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2007-04-13 13:50 |只看该作者
原帖由 springzbz 于 2007-4-12 19:29 发表于 4楼  
另外我想问任何一个进程,无论是父 还是 子进程 返回到主函数时,遇到exit(0),那会不会等另一个进程返回主函数的exit(0)才推出程序呢?


exit(3) 的作用是退出当前进程,它不会去等待其他进程,不论这个其他进程是调用 exit 进程的子进程还是父进程。如果某进程要等待其子进程,可以用 wait(3) 函数;而子进程要等待父进程(和父进程同步),就需要其他的 IPC 机制。具体参见 APUE2 相关章节。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP