关于parent process 和 child process的问题

kaphoon 2004-07-12 08:54:24
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<iostream>
using namespace std;
int main()
{
pid_t pid;
if((pid = fork() )<0)
{
perror("Error");
exit(1);
}else if(pid > 0)
{
sleep(5);
cout<<" hello ";
waitpid(-1,NULL,WNOHANG);
}else
{
cout<<" world ";
_exit(2);

}
}
关于parent process 和 child process的问题
a.上面存不存在race condition,也就是说上面的运行结果确定吗?

b.我的初衷是用子进程打印"hello",父进程打印"world",怎么修改程序才能实现?

c.apue书上"waitpid提供了一个wait的非阻塞版本",我可不可以怎么理解?
就是让child process执行完,再待它退出后,然后对它进行善后处理.
该怎么理解这个阻塞?

d.stdout,STDOU_FILENO,cout,这三个东西是不是指的是同个东西.
当在一个进程中exit后,关闭了了所有标准i/o流,是不是就不能在对它们三个中的任何一个进行写,
除非进行一些另外的操作?

...全文
370 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaphoon 2004-07-15
  • 打赏
  • 举报
回复
a.我的是linux2.4核心
为什么我用了sleep
还是一个结果呢?
if((pid = fork() )<0)
{
perror("Error");
exit(1);
}else if(pid ==0)
{
sleep(5);
cout<<" hello ";
_exit(2);
}else
{
cout<<" world ";
wait(NULL);
}|


}

Hmilzy 2004-07-13
  • 打赏
  • 举报
回复
a.应该有race condition,如果不加其他的代码,屏幕输出应该是"world hello";

b、c.要想打印"hello world"的话,就应该涉及到进程间的通信(同步了),要不加一个信号量,要不就干脆用Send和Receive组合,使得父进程在子进程打印出"hello"后在继续执行;
waitpid在下不太知道(在下搞的是QNX开发),可想必也如"lifeixiao(李飞笑)"兄长所说,如果想用waitpid使得屏幕输出正常的话,那就把父进程的打印加到waitpid之后吧(猜的,不知道对否);

d.三个东西都是指向的标准输出(如果没有其他的处理的话),如果在一个由fork()派生的子进程中将它们关闭,是不影响其他进程的正常打印操作的,因为进程是有其独自的文件描述符备份的,应该是这样的。
lifeixiao 2004-07-13
  • 打赏
  • 举报
回复
a.在大多数情况下是确定的。但并不完全确定,要看具体情况。
b.else if(pid > 0)
{
sleep(5);
cout<<" world";
waitpid(-1,NULL,WNOHANG);
}else
{
cout<<" hello";
_exit(2);

}
c.waitpid得阻塞是指父进程在等待有子进程结束或指定得子进程结束。在没有子进程结束或者要等待得子进程未结束之前,父进程将在waitpid处阻塞,不会向下执行。而非阻塞版本则可以向下执行
d.stdout,STDOU_FILENO是指标准输出,cout是c++得语法,我不太了解。进程exit之后进程就结束了,当然不能再进行操作。不过我怀疑这可能不是楼主想问的,请表述明白一点。
cooolfish 2004-07-13
  • 打赏
  • 举报
回复
a.上面存不存在race condition,也就是说上面的运行结果确定吗?
2.4内核存在随机性,2.6内核保证fork出的子进程先于父进程运行

b.我的初衷是用子进程打印"hello",父进程打印"world",怎么修改程序才能实现?
通过信号控制

c.apue书上"waitpid提供了一个wait的非阻塞版本",我可不可以怎么理解?
就是让child process执行完,再待它退出后,然后对它进行善后处理.
该怎么理解这个阻塞?
弄清楚组塞得概念,waitpid的非组塞特型表示调用它时如果没有子进程退出则直接返回
而不是一直等在那,所以waitpid多半和signal相关函数同时使用,signal,sigaction捕获子
程序退出信号在调用waitpid,具体可以查看man signal,man 2 wait/waitpid





lysliberty 2004-07-13
  • 打赏
  • 举报
回复
输出结果不一定拉,因为父进程、子进程谁先运行由操作系统决定。

一般的来讲,父进程利用wait()来获得子进程的结束状态并防止子进程称为“孤儿进程”,
父进程在调用wait()后阻塞,直到有子进程结束。
waitpid可以获得指定pid的子进程结束状态而不会造成父进程阻塞。

stdout,STDOU_FILENO是标准输出文件描述符,cout是c++中的标准输出函数,根本就不是一回事。

只要调用exit()进程就会结束,当然就不能再写拉!
kaphoon 2004-07-13
  • 打赏
  • 举报
回复
a.在大多数情况下是确定的。但并不完全确定,要看具体情况。
>>>>>
能说的详细点吗?
什么叫具体情况?
Vue.js是十分耀眼的项目之一,受到国内外开发人员的极度推崇。内容包括Vue.js概述、Vue.js的安装、定义页面、渲视图、路由、发送HTTP请求、表单的绑定和提交、打包、部署、解决js的跨域问题、Debug、Component、Vuex、页面的生命周期等,*后还给出一个实战案例供读者了解Vue.js项目开发过程。2020-2021最新Vue.js零基础入门到精通实战开发课程视频教程下载。课程以项目实战为驱动,帮你打开通往Vue.js的任督二脉,让你迅速成为一个优秀的Vue.js开发人员。 一、课程介绍Vue.js致力于构建数据驱动的web应用开发框架,是一个精简的MVVM。Vue.js 专注于 MVVM 模型的 ViewModel 层。简单的数据操作,就可以完成页面的更新,当然也有很多类似的框架,如Angular,React,但是Vue以简洁化,轻量级,数据驱动,模块友好等优势深受企业以及前端开发者的喜爱,成为前端开发人员必备的技能。2020年了,你还只会用jQuery吗?本课程以项目实战为驱动,帮你打开通往Vue.js的任督二脉,让你迅速成为一个优秀的Vue.js开发人员。二、课程需知我们的课程面向的同学是:需要有网页开发基础,熟悉HTML/CSS/JavaScript等前端开发技术,初步掌握JSON,闭包,AJAX…等JavaScript技术,在进阶阶段的课程中会使用ES6的一些语法,因此事先掌握一些ES6的知识也是有必要的。三、内容编排本课程分为三大部分讲解了运用Vue.js 进行项目实战开发。内容包括:第一步:Vue.js基础1、初识vue.js 2、模板语法3、计算属性4、class与style绑定5、条件渲染6、列表渲染7、fetch&axios8、事件处理器9、表单控件10、组件化开发第二步:Vue.js进阶1、过渡动画效果2、自定义指令3、单文件组件4、路由vue-router第三步:项目实战1、卖座苹果网站项目- 引入iconfont- 路由搭建- axios以及反向代理-嵌套路由-数据渲染2、Vue.js第三方框架使用-Element UI-mintUI3、状态管理vuex课程详细目录:Vue.js 课程介绍.docx第001集-1vue初识第002集-2条件渲染第003集-3tab切换第004集-4列表渲染第005集-5模板语法第006集-6计算属性第007集-7侦听器和class第008集-8内联样式第009集-9事件绑定第010集-10表单输入绑定第011集-11过渡动画第012集-12todolist应用第013集-13生命周期与组件生命周期第014集-14组件之间的传值第015集-15$root_$parent_$children第016集-16v-model与插槽第017集-17vue-cli第018集-18vue-devtools第019集-19vue-cli原理第020集-20vue组件化第021集-21vue聊天框第022集-22socket初识和安装第023集-23单聊和群聊以及命名空间第024集-24聊天项目第025集-25聊天登录登出第026集-26聊天列表第027集-27个人聊天第028集-28单聊功能第029集-29自动滚动和聊天第030集-30群聊第031集-31注意编译地址第032集-32vue实现原理1第033集-33vue实现原理2第034集-34less第035集-35vue-less使用第036集-36sass第037集-37vue-router第038集-38动态路由和嵌套路由第039集-39命名视图和组件传参第040集-40vue路由高级应用第041集-41Vue路由守卫第042集-42vuexstate第043集-43vuex getter第044集-44vuex-action第045集-45vuex-module第046集-46vuex-插件第047集-47vuex-vant第048集-48网易严选商城第049集-49网易商城首页第050集-50分类列表第051集-51产品列表第052集-52产品列表2第053集-53商品产品页面第054集-54产品sku第055集-55产品购物车第056集-56购物车

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧