当前位置:首页 > 001-操作系统原理
[键入文字]
1. 本程序中包含了多个系统调用,包括:
a) open,用来打开命令行参数中第一个参数表示的文件; b) creat,用来创建命令行第二个参数表示的文件; c) read,读文件; d) write,写文件。
2)编译该程序时应输入:gcc –o file file.c
这样可生成可执行程序file;另外因为该程序中使用了命令行参数传递机制,因此运行该程序时应输入:
./file aa bb
其中文件aa是当前目录中已存在的文件,而bb是一个新文件。
3) 程序正确执行后将完成把命令行中输入的第一个文件内容拷贝到第二个参数表示的文件中,如按上命令行输入的话,就将文件aa 拷贝成bb。
2、阅读下列C程序并回答以下问题:
1)该程序中是否建了子进程?使用的是哪个系统调用创建的? 2)在本程序中还使用了哪些系统调用?它们完成了什么操作?
3)分析该程序被正确执行时应输出怎样的结果?并根据你的理解解释为什么会输出这样的结果。
#include
int global = 6; /*全局变量,初始化为6*/ int main(void) {
pid_t pid;
int local = 7; /*局部变量,初始化为7*/ printf(“before fork.\\n”); pid = fork(); if (pid == 0) {
global++; local++;
printf(“global = %d, local = %d\\n”, globel, local); }
25
[键入文字]
}
else if (pid > 0) {
wait(NULL);
printf(“global = %d, local = %d\\n”, globel, local); } else {
printf(“fork error!\\n”); exit(1); }
printf(“end fork.\\n”); exit(0);
★考核知识点:进程创建系统调用应用题。参见P110-116及课件
答:
1)该程序共创建了1个子进程,使用fork()系统调用创建的。
2)该程序还使用了wait(NULL)系统调用,用来挂起父进程,等待子进程的结束;还是用了exit()系统调用用来终止当前进程。 3)输出结果为: before fork.
global = 7, local = 8 end fork.
global = 6, local = 7 end fork.
因为执行输出”before fork”这个语句时,只有一个进程,所以这个语句只输出一次,而执行输出”end fork.”这个语句时,有两个进程,所以会输出两次。在子进程中global和local都被加1,因此子进程的输出结果是” global = 7, local = 8”,子进程对变量的修改不会影响到父进程,因此父进程的输出结果是” global = 6, local = 7”。同时wait(NULL)系统调用使父进程阻塞至子进程结束,所以子进程会先输出,而父进程会后输出。
3、阅读程序并回答问题
1)该程序中采用的是何种通信机制?这种通信机制的特点是什么?
26
[键入文字]
2)该程序使用了哪些系统调用?
3)该程序运行中可以捕获到什么操作,捕获操作后完成了哪些工作?
#include
void catchint(int signo ); main() { int i;
signal(SIGINT,catchint); for(i=1;i<5;i++)
{printf(“sleep call # %d \\n”,i); sleep(1);}
printf(“Exiting.\\n”); exit(0); }
void catchint(int signo) {
printf(“\\n CATCHINT;signo=%d;”,signo); printf(“CATCHINT,returning.\\n”); }
★考核知识点:信号量通信应用题。参见P171-175
解:
1)该程序采用的是信号量通信机制,这种机制的特点是在进程间传递控制信号,用来交互进程的各自工作状态情况。
2)使用到了信号量捕获signal系统调用,使用到了exit系统调用终止进程执行。 3)在程序运行中主要捕获“delete”键的操作,当捕获到该键时做出的反映是执行一个动作函数catchint(),将捕获到的信号量值输出,并输出执行动作函数的提示信息。
27
共分享92篇相关文档