预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

.... /NUMPAGES6 实验二Linux进程、线程与编程实验 一、实验目的 1、通过编写一个完整的守护进程,掌握守护进程编写和调试的方法 2、进一步熟悉如何编写多进程程序 二、实验环境 硬件:PC机一台,JXARM9-2410教学实验平台。 软件:Windows98/XP/2000系统,虚拟机环境下的Linux系统。 三、预备知识 1、fork() fork()函数用于从已存在的进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、代码段、进程堆栈、存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等 2、exit()和_exit()的区别 _exit()函数的作用最为简单:直接使进程停止运行,清除其使用的存空间,并销毁其在核中的各种数据结构; exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。 exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的容写回文件,就是图中的"清理I/O缓冲"一项。 3、wait()和waitpid() wait()函数是用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程完毕或者该进程接到了一个指定的信号为止。如果该父进程没有子进程或者他的子进程已经完毕,则wait()就会立即返回。 四、实验容 在该实验中,读者首先创建一个子进程1(守护进程),然后在该子进程中新建一个子进程2,该子进程2暂停10s,然后自动退出,并由子进程1收集子线程退出的消息。在这里,子进程1和子进程2的消息都在系统日志文件(例如“/var/log/messages”,日志文件的全路径名因版本的不同可能会有所不同)中输出。在向日志文件写入消息之后,守护进程(子进程1)循环暂停,其间隔时间为10s。 五、实验步骤 1.分析下面的代码,注意它的运行会产生几个进程以与掌握fork()调用的具体过程。 /*multi_proc_wrong.c*/ #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<unistd.h> #include<sys/wait.h> intmain(void) { pid_tchild1,child2,child; /*创建两个子进程*/ child1=fork(); child2=fork(); /*子进程1的出错处理*/ if(child1==-1) { printf("Child1forkerror\n"); exit(1); } elseif(child1==0)/*在子进程1中调用execlp()函数*/ { printf("Inchild1:execute'ls-l'\n"); if(execlp("ls","ls","-l",NULL)<0) { printf("Child1execlperror\n"); } } if(child2==-1)/*子进程2的出错处理*/ { printf("Child2forkerror\n"); exit(1); } elseif(child2==0)/*在子进程2中使其暂停5s*/ { printf("Inchild2:sleepfor5secondsandthenexit\n"); sleep(5); exit(0); } else/*在父进程中等待两个子进程的退出*/ { printf("Infatherprocess:\n"); child=waitpid(child1,NULL,0);/*阻塞式等待*/ if(child==child1) { printf("Getchild1exitcode\n"); } else { printf("Erroroccured!\n"); } do { child=waitpid(child2,NULL,WNOHANG);/*非阻塞式等待*/ if(child==0) { printf("Thechild2processhasnotexited!\n"); sleep(1); } }while(child==0); if(child==child2) { printf("Getchild2exitcode\n"); } else {