实验五:Linux进程管理

实验五:Linux进程管理

一、实验目的

  1. 熟练使用进程操作函数编写程序。
  2. 熟练掌握exec函数族的用法。
  3. 掌握同步进程的方法。

二、实验环境

Ubantu或Centos

三、实验内容

1.创建进程

  • 创建一个进程
  • 利用循环结构创建多个进程

2.exec函数族

使用execv()函数调用用户程序,更改子进程的功能。

3.进程同步

使用循环创建多个子进程,使用wait()函数完成所有子进程的回收工作。

4.进程管理命令

熟练使用进程管理命令管理与查看进程信息。
需练习的进程管理命令有:pstoppstreepgrepnicebgfgjobskill

四、实验步骤

1. 创建进程——fork()

预备知识

fork()函数用于创建进程,该函数的原型如下:

pid_t fork(void);

函数调用成功后,

  • 父进程中的fork()函数返回子进程的pid
  • 子进程中的fork()函数返回0

函数调用失败则返回-1

fork()函数的使用

2. exec函数族

预备知识

  • execl()
    execl()函数的原型如下:
int execl(const char *path, const char *arg, ...);
  • execlp()
    execlp()函数的原型如下:
int execlp(const char *file, const char *arg, ...);
  • execle()
    execle()函数的原型如下:
int execle(const char *path, const char *arg, ..., char * const envp[]);
  • execv()
    execv()函数的原型如下:
int execv(const char *path, char *const argv[]);
  • execvp()
    execvp()函数的原型如下:
int execvp(const char *file, char *const argv[]);
  • execve()
    execve()函数的原型如下:
int execve(const char *path, char *const argv[], char *const envp[]);

exec函数族的使用

3. 进程同步

预备知识

进程同步中用到的函数有wait()waitpid()

wait()函数

wait()函数的原型如下:

pid_t wait(int *status);

wait()的功能是阻塞等待子进程终止,回收子进程资源,调用wait()函数的进程会被挂起,进入阻塞状态,直到它的某个子进程变为僵尸态。
wait()函数中的参数status可以为NULL,当其不为NULL时,参数status将用于获取回收子进程的退出状态。
退出状态存放在参数status的低8位中,可通过Linux系统中提供的一组宏函数来获取,其中最常用的宏函数有WIFEXITED()WEXITSTATUS(),它们的参数与wait()函数相同,都是一个整型的status
宏函数的功能分别如下:

  • WIFEXITED(status):用于判断子程序是否正常退出,若是,返回非零值;否则返回0。
  • WEXITSTATUS(status)WEXITSTATUS()通常与WIFEXITED()结合使用,若WIFEXITED返回非零值,即正常退出时,使用该宏可以提取出子进程的返回值。

waitpid()函数

waitpid()函数的原型如下:

pid_t waitpid(pid_t pid,int *status,int options);

waitpid()也可回收子进程资源,但可通过传递不同参数,设置waitpid()函数回收子进程的方式,以及回收子进程的范围。

  • 参数pid一般是进程的pid,但也会有其它取值。
    参数pid的取值及其意义分别如下:

    1. pid>0时,只等待pid与该参数相同的子进程;
    2. pid=-1时,waitpid()函数与wait()函数作用相同,将阻塞等待并回收一个子进程;
    3. pid=0时,等待同一个进程组的所有子进程;
    4. pid<-1时,等待指定进程组中的任何子进程,进程组的id等于pid的绝对值。
  • 参数options提供控制waitpid()的选项,该选项是一个常量,或由|连接的两个常量。该选项支持的选项如下:

    1. WNOHANG,即使子进程没有终止,waitpid()也会立即返回;
    2. WUNTRACED,如果子进程暂停执行,则waitpid()立刻返回;
    3. 若不想使用该参数,可以将其值设置为0
  • waitpid()函数的返回值会出现3种情况:

    1. 正常返回时,waitpid()返回捕捉到的子进程的pid
    2. options的值为WNOHANG,但调用waitpid()时发现没有已退出的子进程可收集,则返回0
    3. 若调用过程出错,返回-1errno会被设置成相应的值以指示错误位置。

进程同步的实现

4. 进程管理命令

ps命令

  • BSD风格的常用选项:a/u/x/e/f
  • SysV风格的常用选项:-a/-e/-f/-o/-l

top命令

top命令常用热键:l/t/m/M/P/T/r/i/k

  • l/t/m ——控制top前几行信息的显示
  • top ——在终端启动top命令
  • M ——根据常驻内存集的大小为进程排序
  • P ——根据%CPU为进程排序
  • T ——根据TIME+为进程排序
  • i ——忽略闲置和僵死的进程
  • k ——终止一个进程

pstree命令

pstree命令常用选项:-a/-c/-h/-u/-n

pstree –h     //列出树状图

pgrep命令

pgrep命令常用选项:-o/-n/-p/-t/-u

pgrep –o itcast			//根据用户名itcast查找进程,仅显示pid最小的进程
pgrep –n root			//根据用户名root查找进程,仅显示pid最大的进程

nice命令

nice –n 5 bash		    //更改bash 的优先级
nice –n 6 top			//启动top进程后,更改top进程优先级、

bg / fg / jobs

top &				//在后台启动top命令
top					//在前台启动top命令
Ctrl+Z				//将top送往后台
jobs			    //查看当前终端后台运行的进程
fg 1				//将作业编号为1的top进程调回前台	

kill命令

ps					//查看终端运行的进程
kill -9 5825	    //杀死进程pid为5825的进程	

五、实验总结

代码注意头文件导入,顺便说一句VIM真香。

你可能感兴趣的:(#,Linux系统管理和自动化运维)