实验一进程创建 Linux实验报告.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验一 进程创建 【实验目的和要求】 1、1.了解进程的概念及意义; 2.了解子进程和父进程; 3.掌握创建进程的方法。 【实验内容】 1、1.子进程和父进程的创建; ? ?2.编写附件中的程序实例; ? ?3.撰写实验报告。 【实验原理】 1、原型: #include unistd.h pid_t fork(void); 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。fork函数创建子进程的过程为:使用fork函数得到的子进程是父进程的一个复制品,它从父进程继承了进程的地址空间,包括进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端,而子进程所独有的只有它的进程号、资源使用和计时器等。通过这种复制方式创建出子进程后,原有进程和子进程都从函数fork返回,各自继续往下运行,但是原进程的fork返回值与子进程的fork返回值不同,在原进程中,fork返回子进程的pid,而在子进程中,fork返回0,如果fork返回负值,表示创建子进程失败。 子进程和父进程继续执行fork调用之后的指令。子进程是父进程的副本。例如,子进程获得父进程数据空间、堆和栈的副本。注意,这是子进程所有用的副本。父进程和子进程并不共享这些存储空间部分。父进程和子进程共享正文段。 2、原型: #include unistd.h pid_t vfork(void); vfork函数的调用序列和返回值与fork相同,但两者的语义不同。vfork函数用于创建一个新进程,而该进程的目的是exec一个新程序。vfork不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec,它在父进程的空间中运行。vfork保证子进程先运行,在它调用exit之后父进程才可能被调度运行,当子进程调用这两个函数中的任意一个时,父进程会恢复运行。 【程序代码】 1、1_fork.c #include stdio.h #include stdlib.h #include unistd.h int var = 10; int main(int argc,char *argv[]) { pid_t pid; int num = 9; pid = fork(); if(pid0)//fork函数创建进程失败! { perror(fork); } if(pid==0)//子进程 { var++; num++; printf(in son process var = %d,num=%d\n,var,num); } else//父进程 { sleep(1); printf(in father process var=%d,num=%d\n,var,num); } printf(common code area\n); return 0; } 2、2_vfork.c #include stdio.h #include stdlib.h #include unistd.h int var = 10; int main(int argc,char *argv[]) { pid_t pid; int num = 9; pid = vfork();//创建进程 if(pid0) { perror(vfork); } if(pid == 0) { var++; num++; printf(in son process var=%d,num=%d\n,var,num); _exit(0); } else { printf(in father process var=%d,num=%d\n,var,num); } return 0; } 【实验步骤】 一、 1、打开终端,输入命令gedit 1_fork.c,在1_fork.c文件中输入1_fork.bmp中的代码; 2、输入命令gcc 1_fork.c -o 1_fork,回车后显示无错误; 3、输入命令:./1_fork运行程序。 二、 1、打开终端,输入命令gedit 2_vfork.c,在2_vfork.c文件中输入2_vfork.bmp中的代码; 2、输入命令gcc 2_vfork.c -o 2_vfork,回车后显示无错误: 3、输入命令:./2_vfork运行程序。 【实验结果】 1、 从上面可以看到两次的运行结果不一样。我们知道write函数是不带缓存的。因为在fork之

文档评论(0)

baoyue + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档