- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
LINUX作业解答
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之后父子进程除非采用了同步手段,否则不能确定谁先运行,也不能确定谁先结束。
4. 如果子进程继续执行,子进程中fork调用返回0,执行第一个分支,输出this is child, my pid is 3845。如果父进程继续执行,fork()调用返回子进程的PID,执行第2个分支,输出:this is parent, child has pid 3845, and my pid is 3844;如果fork()不成功,执行第3个分之,输出:fork fail。程序中操作系统首先调用子进程,后调用父进程,于是得到程序的结果。
2. 写出程序的执行结果,并分析程序的执行过程。
#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(“***AAA
您可能关注的文档
最近下载
- 电子数据取证技术PPT课件(共12章)第3章取证技术基础.pptx VIP
- 电子数据取证技术PPT课件(共12章)第2章电子数据取证规范.pptx VIP
- 北师大版三年级数学上册 (长方形周长)周长课件教学.pptx
- 23G518-1门式刚架轻型房屋钢结构(无吊车).docx
- 电子数据取证技术PPT课件(共12章)第5章UNIXLinux操作系统取证技术.pptx VIP
- 砥砺身心成就未来主题班会.pptx VIP
- 2024年《公文写作与处理》考试题库大全(含答案).pdf VIP
- 电子数据取证技术PPT课件(共12章)第9章网络取证技术.pptx VIP
- 建设银行笔试试题.docx
- 电子数据取证技术PPT课件(共12章)第4章Windows操作系统取证技术.pptx VIP
文档评论(0)