Linux实验报告 联系客服

发布时间 : 星期五 文章Linux实验报告更新完毕开始阅读

mode_to_str(buf.st_mode, modestr);

printf(\ printf(\

printf(\ printf(\ printf(\

printf(\ printf(\}

main(int ac, char *av[]){ DIR * dirp;

struct dirent * p;

if(1==ac){

dirp=opendir(\ }else{

dirp=opendir(av[1]); }

while((p=readdir(dirp))!=NULL){ if(p->d_name[0]!='.'){

show_file_info(p->d_name); } }

closedir(dirp); }

3. 设备文件操作

在/dev目录下,找到你的鼠标对应的文件。打开这个文件,从该文件循环读出字符,并将字符对应的ascII代码在终端显示出来。

【实验总结】

通过这个实验,我学会了如何在编译器里操作文件,也学会了如何使用man手册。

实验三 进程间通信

UNIX/LINUX系统的进程间通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉LINUX支持的信号量机制、管道机制、消息通信机制及共享存储区机制。

(一)进程创建实验

【实验内容】

1.进程的创建

编写一段程序,使用系统调用fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b” 和“c”。试观察记录屏幕上的显示结果,并分析原因。 # include main()

{ int p1, p2;

while((p1=fork())= = -1); if(p1= =0)

putchar(‘b’); /*在子进程1中*/ else /*在父进程中*/ { while((p2=fork())= =-1); if(p2= =0)

putchar(‘c’); else putchar( ‘a’); } }

/*在子进程2中*/ /*在父进程中*/

实验结果为: cb

2. 修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。

<参考程序>

# include main()

{ int p1, p2, i;

while((p1=fork())= = -1);

if(p1= =0) /*在子进程1中*/ for(i=0;i<500;i++)

printf(“daughter %d\\n”,i); else

{ while((p2=fork())= =-1);

If(p2= =0) /*在子进程2中*/ for(i=0;i<500;i++) printf(“son%d\\n”,i); else

for(i=0;i<500;i++)

printf(“parents%d\\n”,i); } }

由于输出500的循环太大,无法看到全部结果,i分别采用3,10,100,当i为3时,是先输出3个“parents i ”,然后再输出3个“son i”,最后输出5个“daughter i”;当i为10时,结果与i为3一样;截图如下:

但是当i为100时,是先输出100个“parents i”,再输出“son i” 但是在“son i”输出的同时,“daughte i”也开始输出,由于屏幕显示有限,图片就不粘贴了。 当“parents i”全部输出完之后,开始输出“son i”; 在“son i”输出的过程中,也开始输出“daughter i”: 最后输出完“daughter i”。 当i为500时,“parent i”输出的时候,“son i”也开始输出,但整体上是“parent i”先输出完,然后是“son i”,最后是“daughter i”

【思考题】

1.系统是怎样创建进程的?

答:linux 系统创建进程都是用 fork() 系统调用创建子进程,在UNIX系统中,只有0进程是在系统引导时被创建的,在系统初启时由0进程创建1进程,以后0进程变成对换进程,1进程成为系统中的始祖进程。UNIX利用fork( )为每个终端创建一个子进程为用户服务,如等待用户登录、执行SHELL命令解释程序等,每个终端进程又可利用fork( )来创建其子进程,从而形成一棵进程树。可以说,系统中除0进程外的所有进程都是用fork( )创建的。

fork() 函数被调用一次,但返回两次。如果 fork()进程调用成功,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程号

2.当前运行的程序(主进程)的父进程是什么?

答:当前运行的程序(主进程)的父进程是fork()出这个进程的进程,在UNIX系统中,只有0进程是在系统引导时被创建的,在系统初启时由0进程创建1进程,以后0进程变成对换进程,1进程成为系统中的始祖进程。

【实验总结】

通过本次实验,掌握了进程的概念,明确进程和程序的区别:通俗的讲程序是一个包含可以执

行代码的文件,是一个静态的文件.而进程是一个开始执行但是还没有结束的程序的实例.就是可执行文件的具体实现. 一个程序可能有许多进程,而每一个进程又可以有许多子进程.依次循环下去,而产生子孙进程. 当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用.在系统里面只有进程没有程序; 认识和了解并发执行的实质,即linux中内核并发机制也就是同步机制产生的原因,总的来说可归纳为一下4点:l 中断——中断几乎可以在任何时刻异步发生,也就可能随时打断当前正在执行的代码;2 睡眠及与用户空间的同步——在内核执行的进程可能会睡眠,这就会唤醒调度程序,从而导致调度一个新的用户进程执行;3 对称多处理——两个或多个处理器可以同时执行代码;4内核抢占——因为内核具有抢占性,所以内核中的任务可能会被另一任务抢占(在2.6内核引进的新能力)。