1、试验六Linux进程编译嵌入式操作系统应用开发课程实验报告班 级: * 学 号: * 姓 名:* 指导老师: * 成 绩: 实验六:Linux进程编程一、目的与任务目的:了解掌握操作系统进程的特点与功能,学会借助Linux进程的功能函数进行编程。任务:利用C语言指令编写程序调用进程函数,完成相应功能。二、内容、要求与安排方式1、实验内容与要求:1)通过简单程序编写了解掌握Linux进程编程基本概念、进程关系。2)守护进程与多进程并发案例、守护进程的编写。3)编程验证孤儿进程的产生与回收。4)编程验证僵尸进程的产生与回收。2、实验安排方式:采用1人1组,上机在Linux系统下进行编程实验。三、程
2、序清单编码头文件存放在文件”ch06.h”中:#include #include #include err_exit.h#include #include #include #include #include 添加“err_exit.h”文件获取导致函数调用失败的原因;#include #include #define err_exit(MESSAGE) ( perror(MESSAGE), exit(1) ) (1) 1-1应用程序创建进程的唯一方法是通过现有进程调用folk()函数;注释:用folk创建的子进程基本上是父进程的克隆,所以他包含了父进程的许多特征;#include ch06.
3、hint global = 5;int main(void) pid_t pid; char *string = I am parent; int local = 10; printf( before fork- ); if (pid = fork() 0) /* fork调用失败 */ err_exit(fork); if (pid = 0) /* 子进程 */ string = I am child; printf(%s, my pid=%d: global=%d, local=%dn, string, getpid(), global, local); global +; else /*
4、 父进程 */ printf(%s, my pid=%d: global=%d, local=%dn , string, getpid(), global, local); local+; printf(At join point, %s: global=%d, local=%dn, string, global, local); exit(EXIT_SUCCESS);1-2用刚建立的子进程调用exec()执行一个新程序;#include ch06.hchar *env_init=USER=unknow,PATH=/tmp,NULL;char *path = /home/zkj/book/ch
5、06/echoall;int main(void) pid_t pid; if (pid=vfork() 0) err_exit (vfork error); else if (pid = 0) /* 子进程 */ if (execle(path, echoall, arg1, ARG2, (char *)0, env_init) 0) err_exit(execle error); else if (pid=vfork() 0) err_exit(vfork error); else if (pid = 0) /* 子进程 */ if (execlp(./echoall, echoall,
6、only one arg, (char *)0)= 0) /* 等待子进程 */ pr_exit(status, pid); perror(wait over); exit(EXIT_SUCCESS);(2)守护进程;#include#include#include#include/ open#include#include#include#include#include#define MAXFILE 65535volatile sig_atomic_t _running = 1;int fd;/ signal handlervoid sigterm_handler(int arg) _run
7、ning = 0;int main() pid_t pid; char *buf = This is a Daemon, wcdjn; /* 屏蔽一些有关控制终端操作的信号 * 防止在守护进程没有正常运转起来时,因控制终端受到干扰退出或挂起 * */ signal(SIGINT, SIG_IGN);/ 终端中断 signal(SIGHUP, SIG_IGN);/ 连接挂断 signal(SIGQUIT, SIG_IGN);/ 终端退出 signal(SIGPIPE, SIG_IGN);/ 向无读进程的管道写数据 signal(SIGTTOU, SIG_IGN);/ 后台程序尝试写操作 sign
8、al(SIGTTIN, SIG_IGN);/ 后台程序尝试读操作 signal(SIGTERM, SIG_IGN);/ 终止 / test /sleep(20);/ try cmd: ./test &; kill -s SIGTERM PID / 1 fork child process and exit father process pid = fork(); if(pid 0) exit(0); / 2 create a new session setsid(); / 3 set current path char szPath1024; if(getcwd(szPath, sizeof(
9、szPath) = NULL) perror(getcwd); exit(1); else chdir(szPath); printf(set current path succ %sn, szPath); / 4 umask 0 umask(0); / 5 close useless fd int i; /for (i = 0; i MAXFILE; +i) for (i = 3; i MAXFILE; +i) close(i); / 6 set termianl signal signal(SIGTERM, sigterm_handler); / open file and set rw
10、limit if(fd = open(outfile, O_CREAT|O_WRONLY|O_APPEND, 0600) 0) perror(open); exit(1); printf(nDaemon begin to work., and use kill -9 PID to terminaten); / do sth in loop while(_running) if (write(fd, buf, strlen(buf) != strlen(buf) perror(write); close(fd); exit(1); usleep(1000*1000);/ 1 s close(fd
11、); / print data if(fd = open(outfile, O_RDONLY) 0) perror(open); exit(1); char szBuf1024 = 0; if(read(fd, szBuf, sizeof(szBuf) = -1) perror(read); exit(1); printf(read 1024 bytes:n%sn, szBuf); close(fd); return 0;(3)孤儿进程代码1 #include 2 #include 3 #include 4 #include 5 6 int main() 7 8 pid_t pid; 9 /创
12、建一个进程10 pid = fork();11 /创建失败12 if (pid 0)13 14 perror(fork error:);15 exit(1);16 17 /子进程18 if (pid = 0)19 20 printf(I am the child process.n);21 /输出进程ID和父进程ID22 printf(pid: %dtppid:%dn,getpid(),getppid();23 printf(I will sleep five seconds.n);24 /睡眠5s,保证父进程先退出25 sleep(5);26 printf(pid: %dtppid:%dn,
13、getpid(),getppid();27 printf(child process is exited.n);28 29 /父进程30 else31 32 printf(I am father process.n);33 /父进程睡眠1s,保证子进程输出进程id34 sleep(1);35 printf(father process is exited.n);36 37 return 0;38 (4)僵死进程代码:#include ch06.hint main(void) pid_t pid; char *message; int n; printf(fork program startn)
14、; pid = fork(); switch(pid) case -1: exit(EXIT_FAILURE); case 0: message = This is child; n = 1; break; default: message = This is parent; n = 5; break; puts(message); sleep(n-1); exit(EXIT_SUCCESS);四、实验过程(1)用folk()得到子父进程的关系;用exec()执行一个新的程序进程的不同终止状态(2) 守护进程编写执行结果(3) 孤儿进程(4)僵死进程执行结果;五、实验体会(2)守护进程:在Linux/UNIX系统引导的时候会开启很多服务,这些服务称为守护进程(也叫Daemon进程)。守护进程是脱离于控制终端并且在后台周期性地执行某种任务或等待处理某些事件的进程,脱离终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的中断信息所终止。(3)孤儿进程:一个父进程退出,而它的一个或多个子进程还在进行,那么那些子进程将成了孤儿进程,孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。指导教师评语:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1