免费注册 查看新帖 |

Chinaunix

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

在这种比较特殊的情况下,是否可能实现进程间的同步? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-14 00:25 |只看该作者 |倒序浏览
本帖最后由 ChiyuT 于 2011-09-14 00:28 编辑

在fork之后,子进程会执行某一小段代码,然后调用exec执行新进程(新进程的代码不能修改)。现在的问题是,exec有可能会执行失败,而父进程中的代码BBB,需要根据exec的执行情况(成功 or 失败)来做出某些决定。

父进程在不调用wait的情况下,是否有其它的办法来知道该信息?

请诸位多多指教,示意代码如下:
  1. if ((pid = fork()) == 0){

  2.         AAA;

  3.         if ( exec()) {
  4.                 ;
  5.         }
  6. }

  7. BBB;
复制代码
如果没有办法的话,恐怕就只能修改代码逻辑了。but最好不要这样。。。{:3_189:}

论坛徽章:
0
2 [报告]
发表于 2011-09-14 05:50 |只看该作者
本帖最后由 vupiggy 于 2011-09-13 22:51 编辑

考虑用 vfork 吗?execve() 成功,vfork 返回,失败父进程还在睡觉 (linux 2.6.28的行为是这样)

论坛徽章:
0
3 [报告]
发表于 2011-09-14 06:06 |只看该作者
本帖最后由 ChiyuT 于 2011-09-14 06:08 编辑

回复 2# vupiggy

谢谢,考虑过vfork,不过它的行为似乎让人不敢放心,感觉能不用的话就尽量不用吧。{:3_190:}

我用valgrind进行测试的时候,发现在valgrind里,即使是采用vfork,仍然是父进程先执行。怕了。不知道这是不是valgrind的bug{:3_199:}

论坛徽章:
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
4 [报告]
发表于 2011-09-14 09:33 |只看该作者
回复 1# ChiyuT


    把你的 BBB 直接放到子进程的 exec() 后面不行么?

另外,exec() 外面那个 if 判断是多余的。若成功,exec() 根本就不返回;若失败,跟在 exec() 后面的代码才有意义。

论坛徽章:
0
5 [报告]
发表于 2011-09-14 09:39 |只看该作者
exec失败之后给父进程发个信号

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
6 [报告]
发表于 2011-09-14 09:55 |只看该作者
vfork 能够父进程先运行的概率比你看错了的概率小上不是一点半点, 在这里 vfork 肯定能用, 而且简直是合适无比

论坛徽章:
0
7 [报告]
发表于 2011-09-14 10:28 |只看该作者
本帖最后由 vupiggy 于 2011-09-14 03:31 编辑

回复 3# ChiyuT
1. 内核提供了 vfork,你就要信任它,否则内核的所有接口你都可以怀疑,那程序还有法往下写吗?
2. 单从用户空间看 vfork 能否胜任你的需求的确有点可疑,这样吧,让代码说话:

  1. /* 内核 do_fork() 函数 */
  2. if (clone_flags & CLONE_VFORK) {
  3.         p->vfork_done = &vfork;
  4.         init_completion(&vfork);
  5. }
  6. ...
  7. if (clone_flags & CLONE_VFORK) {
  8.         freezer_do_not_count();
  9.         wait_for_completion(&vfork);
  10.         freezer_count();
  11.         tracehook_report_vfork_done(p, nr);
  12. }
复制代码
内核一定会让父进程睡觉,而且这个睡觉是 UNINTERRUPTIBLE,信号唤不醒地。父进程醒来只有两种可能,也就是内核里只有两个点调用 complete(&父进程的vfork_done),一个在
mm_release()(另一个地方在 coredump_wait(),就不考虑了吧)。 mm_release() 只有两个地方调用,一个是 do_execve() |-> exec_mmap()-|> mm_release,另外一个是 do_exit() |-> exit_mm() |-> mm_release,也就是说,内核当且仅当经过这两个点会让父进程从 vfork() 返回,这和你从 manpage 里看到的描述是一样的。放心使用吧。

论坛徽章:
0
8 [报告]
发表于 2011-09-14 10:35 |只看该作者
再多说一句关于 mm_release(),当 do_execve() 调用 mm_release() 的时候已经不可能再失败了(除非一种情况 --- 父进程 core dump,这个也不需要考虑),换句话说,子进程的 execve() 失败不会引起父进程的 vfork 返回,再换句话说,父进程从 vfork 返回,不是因为 execve 成功,就是因为子进程退出。

论坛徽章:
0
9 [报告]
发表于 2011-09-14 12:17 |只看该作者
这样如何,如果exec失败,然后通过管道向父进程发送消息, 父进程可以用无阻塞的方式select管道,如果收到子进程发过来的消息,说明exec创建是失败的

论坛徽章:
0
10 [报告]
发表于 2011-09-14 20:02 |只看该作者
回复 4# MMMIX


因为对执行“成功”或者“失败”这两种情况都要分别做出反应,所以BBB放到exec后边显然不行。执行成功的话,BBB就没法执行了。

那个 if 判断是打算在exec失败后看能不能做点儿啥事儿,好通知父进程。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP