菜鸟问个关于fork的问题

sicofield 2013-09-09 03:38:33
下面是一段APUE上管道的示例程序,中间自己添加了一些printf看看程序的运行流程。结果发现子进程的代码段执行了两次而父进程代码段没有执行!!尽然会有这种事!!!实在搞不懂错在哪里。
#include <stdio.h>
#include <unistd.h>
#define BUFSIZE 100
int main()
{
int n;
int fd[2];
pid_t pid;
char buf[BUFSIZE];
if(pipe(fd)<0)
printf("pipe errorn");
if(pid=fork()<0)
printf("fork errorn");
if (pid>0)/*parent*/
{
close(fd[0]);
printf("this is parent process");
write(fd[1],"Hello world",12);
}
if(pid==0) /*child*/
{
//sleep(1);
printf("this is child process");
close(fd[1]);
n=read(fd[0],buf,BUFSIZE);
write(STDOUT_FILENO,buf,n);
}
return 0;
}

这段程序在我的机器上运行结果为:
this is child process
this is child process
...全文
138 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
BT_Dana 2013-09-10
  • 打赏
  • 举报
回复
http://www.slyar.com/blog/c-operator-priority.html 赋值操作符的优先级几乎是最低的了, 仅大于逗号运算符.
再改变 2013-09-09
  • 打赏
  • 举报
回复
Coggle阿水 2013-09-09
  • 打赏
  • 举报
回复
同上,你写漏了括号
qiyu1988 2013-09-09
  • 打赏
  • 举报
回复
if(pid=fork()<0)少了() if((pid=fork())<0)
什么是Docker Docker 最初是dotCloud 公司创始人Solomon Hykes 在法国期间发起的一个公司内部项目, 它是基于dotCloud 公司多年云服务技术的一次革新,并于2013 年3 月以Apache 2.0 授权 协议开源,主要项目代码在GitHub 上进行维护。Docker 项目后来还加入了Linux 基金会, 并成立推动开放容器联盟(OCI)。 Docker 自开源后受到广泛的关注和讨论,至今其GitHub 项目已经超过4 万6 千个星标和一 万多个fork。甚至由于Docker 项目的火爆,在2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在Ubuntu 12.04 上开发实现的;Red Hat 则从RHEL 6.5 开始对 Docker 进行支持;Google 也在其PaaS 产品中广泛应用Docker。 Docker 使用Google 公司推出的Go 语言进行开发实现,基于Linux 内核的 cgroup,namespace,以及AUFS 类的Union FS 等技术,对进程进行封装隔离,属于操作 系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容 器。最初实现是基于LXC,从0.7 版本以后开始去除LXC,转而使用自行开发的 libcontainer,从1.11 开始,则进一步演进为使用runC 和containerd。 Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极 大的简化了容器的创建和维护。使得Docker 技术比虚拟机技术更为轻便、快捷。 下面的图片比较了Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件 后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程 直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比 传统虚拟机更为轻便。

4,469

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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