Linux第三次实验---进程管理

一、实验目的

1、熟悉Linux操作系统环境,掌握Linux命令的一般格式;
2、掌握进程的概念,进程及作业相关的操作命令;
3、掌握查看系统信息的方法。

二、实验环境:

一台运行GNOME图形用户界面的任意一种Linux操作系统的计算机。(Centos7)

三、实验内容与步骤

PART 1 进程基本操作

  1. 查看当前所有进程。
    在这里插入图片描述

  2. 查看当前进程树,找出ps进程的父进程是哪个进程。
    ps进程的父进程为bash
    在这里插入图片描述
    或者通过pstree命令从进程树中找到pstree进程的父进程(由于没有使用ps命令,没有产生ps进程,在使用pstree时找不到ps进程,所以只能找pstree的父进程了)
    在这里插入图片描述

  3. 查看进程树,在进程树中显示进程ID。
    在这里插入图片描述

  4. 杀死bash进程,观察结果。
    在这里插入图片描述
    将bash进程杀死后从管理员切换到了普通用户,如果是普通用户杀死bash进程则退出终端

  5. 在终端窗口,以前台方式启动vi,编辑一个文本文件,文件名自定:vi 文件名
    在这里插入图片描述

  6. 将vi进程切换到后台。
    在这里插入图片描述

  7. 分别查看进程列表,工作列表。
    在这里插入图片描述

  8. 将刚才切换到后台的vi进程切换到前台。 在这里插入图片描述

  9. 退出vi。
    在这里插入图片描述
    在命令模式下输入:q

  10. 在后台查找根目录下所有比/etc/man_db.conf新的文件,并将结果存储到result.txt中。
    在这里插入图片描述

  11. 查看工作列表,是否有find在执行。
    在这里插入图片描述

  12. 等待find工作结束,查看工作列表,还有find在执行吗
    在这里插入图片描述
    13.查看result.txt文件的内容。

太多了就只看了前面的10行
(查看全部可以使用cat result.txt 或者 vi result.txt)
在这里插入图片描述

PART 2 进程管理

  1. 编写一个C程序,程序名为running.c,主函数中包含一个无法正常终止的循环,如:
    int main(int argc,char **argv)
    {
    printf(“The program is running.\n”);
    while (1)
    {
    }
    return 0;
    }
    在这里插入图片描述

  2. 编写一个C程序,程序名为waitkey.c,主函数中包括一个输入语句,等待用户输入一个数据,代码自己写。
    在这里插入图片描述

  3. 分别在两个终端窗口,运行上述两个程序,waitkey程序运行到输入数据语句时,暂时不
    输入。
    在这里插入图片描述
    ./running 执行第一个程序,使用ctrl+T打开另一个终端窗口 ./waitKey执行第二个程序(先使用gcc running -o running进行编译)

  4. 打开第三个终端窗口,用ps命令查看系统中进程,观察上述两个程序的进程状态。
    在这里插入图片描述

  5. 在waitkey程序运行窗口输入数据,程序结束,在第三个终端窗口用ps命令查看系统中进程。
    在这里插入图片描述

  6. 在第三个终端窗口,将running程序对应的进程杀掉,再观察系统中进程。
    在这里插入图片描述

PART 3 定时执行命令

  1. 在指定时间(自己设定,如下午17:00,上午10:00等),找出系统中所有以.c为后缀的文件,将结果保存至/etc/information.txt文件中,并向某用户(自己指定)发信息告知已完成上述工作,信息内容自定。
    在这里插入图片描述
  2. 启动crond服务:service crond restart
    在这里插入图片描述
  3. 建立一个cron作业列表文件,文件名为cronfile_1,内容如下:
    33 10 * * * ls /etc
    34 10 * * * who
    35 10 * * * ps
    说明:前两列对应的为时间,分,小时,为便于观察实验结果,可以根据自己的实际实验时间进行调整,。上述文件内容表示10点33分执行命令ls /etc,10点34分执行命令who,10点35分执行命令ps

在这里插入图片描述

  1. 安装crontab文件,命令为:crontab cronfile_1
    (这里我的文件名是cronWork)

在这里插入图片描述

  1. 用命令查看计划任务表:crontab –l
    在这里插入图片描述

  2. 计划列表中的任务是以前台方式还是后台方式运行

cron是一个守护进程,是个标准的后台服务程序

  1. 当收到邮件通知时,查看邮件信息

由于当时没有设定发送用户,又是在root下运行,邮件都发给了root用户,我没有收到邮件提示,主动到root的邮箱进行查看:
在这里插入图片描述
(查看root的邮件方式:①使用su - 进入root账号和环境,输入mail查看;②进入邮箱目录:cd /var/spool/mail 在这里可以看到所有用户的邮箱(应该是),然后可以cat root就可以看到他的所有信息,但是如果信息很多就可能看不过来;③在上个条件下,进入到mail目录,使用命令mail -f root(指定邮箱名)可以查看到root的邮箱内容(推荐第三种))

PART 4 守护进程

  1. 在自己的工作目录下,建立一个c源文件,文件名自定,如daemon.c
    文件内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/syslog.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>

int init_daemon(void)
{
   pid_t pid;
   int i;
   signal(SIGTTOU,SIG_IGN);
   signal(SIGTTIN,SIG_IGN);
   signal(SIGTSTP,SIG_IGN);
   signal(SIGHUP,SIG_IGN);    
   umask(0);
   if((pid=fork())>0)
   	exit(EXIT_SUCCESS);
   else if(pid<0)
   {
   	perror("fork");
   	exit(EXIT_FAILURE);
   }
   setsid();	
   for(i=0;i<NOFILE;i++)
   	close(i);
   open("/dev/null",O_RDONLY);	
   open("/dev/null",O_RDWR);	
   open("/dev/null",O_RDWR);
   chdir("/");
   signal(SIGCHLD,SIG_IGN);	
   return 0;	
}

int main(int argc,char * argv[])
{
   FILE *fp;  time_t  t;
   int i;
   init_daemon();
    for( i=1;i<=20;i++)
   {  sleep(3);   
      if((fp=fopen("test.log","a")) >=0)
            { t=time(0);
              fprintf(fp,"Im here at %s\n",asctime(localtime(&t)));               
              fclose(fp);
            }
   }
}

截图太长了,只截取了一部分
在这里插入图片描述

  1. 阅读以上程序,读懂代码,观察运行结果。

该函数主要作用是建立一个后台程进程,将/(根目录)设置为默认路径,如果没有test.log文件就创建一个这个文件,并每隔3秒向该文件写入固定格式的程序时间,重复20次。

运行结果:
在这里插入图片描述

  1. 将以上程序主函数进行修改,功能为:在\tmp目录下建立一个文件,文件名为data.txt,对指定目录下的文件进行统计(指定目录可以在程序中直接给出),每隔2分钟,将指定目录下的文件数量写入文件data.txt中,写3次。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/syslog.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <dirent.h>
int init_daemon(void)
{
        pid_t pid;
        int i;
        signal(SIGTTOU,SIG_IGN);
        signal(SIGTTIN,SIG_IGN);
        signal(SIGTSTP,SIG_IGN);
        signal(SIGHUP,SIG_IGN);
        umask(0);
        if((pid=fork())>0)//是父进程,结束父进程,子进程继续,为避免挂起控制终端将Daemon放入后台执行
                exit(EXIT_SUCCESS);
        else if(pid<0)
        {
                perror("fork");
                exit(EXIT_FAILURE);
        }
        setsid();       
        for(i=0;i<NOFILE;i++)
                close(i);
        open("/dev/null",O_RDONLY);
        open("/dev/null",O_RDWR);
        open("/dev/null",O_RDWR);
        chdir("/tmp");//change this file be default file
        signal(SIGCHLD,SIG_IGN);
        return 0;
}

int main(int argc,char * argv[])
{
        FILE *fp;  time_t  t;
        int i;
        DIR *dp;
        struct dirent *filename;

        init_daemon();
			
         for( i=0;i<=3;i++)//执行次数
        {  
				countOfFiles = 0;//初始化文件数量
				sleep(120);//执行间隔120秒
           if((fp=fopen("data.txt","a")) >=0)
             {
                dp = opendir("/home/student");	//指定读取的目录
                if(!dp){		//目录打开异常输出
                        fprintf(fp,"open dir error!\n");
                }
                while(filename = readdir(dp)){	//读取该目录下的所有文件
                        fprintf(fp,"files : %s\n",filename->d_name);//文件名写入
                }
					fprintf(fp,"the number of files:%d\n",countOfFiles);//数量写入
               fclose(fp);
                closedir(dp);
             }
        }
        return 0;
}

运行结果截图:

在这里插入图片描述
参考资料连接:
https://blog.csdn.net/dream_allday/article/details/75243818
http://c.biancheng.net/cpp/html/238.html
https://blog.csdn.net/vblittleboy/article/details/8593067
https://www.runoob.com/cprogramming/c-function-signal.html
https://blog.csdn.net/zhuyi2654715/article/details/7540759
https://www.runoob.com/w3cnote/c-time-func-summary.html
https://www.runoob.com/cprogramming/c-function-fprintf.html

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值