第六章 LINUX作业答案.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1. 有如下的程序: #include sys/types.h main( ) { pid_t pid; pid = fork(); if(!pid) printf(this is child,my pid is %d\n,getpid()); else if (pid0) printf(this is parent,child has pid %d, and my pid is %d\n ,pid,getpid()); else printf(fork fail\n ); } 编译运行后得到如下结果: this is child, my pid is 3845 this is parent, child has pid 3845, and my pid is 3844. 试解释产生上述结果的原因,并分析程序的执行过程。 答案: 1. 原因:程序输出的两行是来自两个进程,是同一个程序的两次执行。 2. 程序的执行过程:主函数首先定义了一个pid_t类型的变量,然后执行到语句pid=fork()一个与父进程相同的共享代码空间fork处继续执行,相互竞争系统的资源。 3. fork之后子进程除非采用了同步手段,否则不能确定谁先运行,也不能确定谁先结束。子进程中fork调用返回0返回子进程的#include sys/types.h #include unistd.h int main() { pid_t result; int var=10; printf(before fork,var=%d\n,var); result=fork(); if(result0) printf(fork fail\n); else if(result0) { var++; printf(This is parent!\n”); } else { var- -; printf(This is child!\n); } printf(after fork var=%d\n,var); return 0; } 假定父子进程均可在一个时间片内执行完,且操作系统每次均先调度子进程。 答案: 程序的执行结果为 before fork,var=10 This is child after fork var=9 before fork,var=10 This is parent! after fork var=11 程序的执行过程如下: 1. 程序先定义了两个变量result和var,然后输出变量var的值,得到before fork var=10这一行输出(父子进程各复制了一份)。 2. 当执行到result=fork()时程序分叉,产生父子两个进程。 3. 系统首先调度子进程执行,直至子进程结束。(题目假定父子进程均可在一个时间片内执行完,且操作系统每次均先调度子进程。)而在子进程中result为0,故执行的是条件分支的最后一个分支,输出: This is child. after fork var=9 4. 子进程执行完了之后调度父进程执行,直至父进程结束。而在父进程中result为子进程号,大于0,于是执行条件分支的第二个个分支,输出: This is parent after fork var=11 3. 分析下列程序,(1)写出执行结果(2)多次执行,每次的执行结果是否相同,分析其原因 #include”stdio.h” #includesys/types.h/*提供类型pid_t的定义*/ #includeunistd.h void main() { pid_t id=0; char *parameter[3]; parameter[0]=”ls” parameter[1]=”-1” parameter[2]=0; printf(“***About to exec ls -1\n”); printf(“***AAAAAAAAA*****\n”); id=fork(); if(id==0) { execvp(“ls”, parameter); } else { wait(NULL); printf(“***ls is done.bye\n”); printf(“***BBBBBBBBBB\n”); } } 答案: ***About to exec ls –l ***AAAAAAAAA***** 文件夹内容列表 ***ls is done.bye ***BBBBBBBBBB***** 执行结果相同,原因是fork创建一个新的子进程,从当前调用fork函数的位置继续向

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档