《C语言》环形双链表——进程管理

《C语言》环形双链表——进程管理

Main.c

#include "ProcessManger.h"

void main()
{

	//创建一个节点(双链表)
	ProcessManger Taskmgr;
	//初始化双链表
	InitList(&Taskmgr);
	//进程列表
	Tasklist(&Taskmgr);
	//显示当前状态
	Show(&Taskmgr);

	//消息循环
	while (1)
	{
		Option(&Taskmgr);
	}
	
}

ProcessManger.h

#pragma once


#ifdef __cplusplus
extern "C"
{
#endif

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
	
	typedef struct ProcessList
	{

		//进程名称    
		char ProcessName[256];
		//进程编号
		unsigned int ProcessID;
		//会话名  
		char DialogueName[256];
		//会话次数
		unsigned int Dialogue;
		//内存使用情况
		unsigned int MemorySize;
	

		//前驱
		struct ProcessList* P_Pre;
		//后继
		struct ProcessList* P_Next;
	}ProcessList;

	typedef struct ProcessManger
	{
		//头指针
		ProcessList* P_Head;

		//尾指针
		ProcessList* P_Tail;
	}ProcessManger;

	//遍历进程
	void Tasklist(ProcessManger* P_List);
	//去除指定空格
	char* EatSpace(char* Str);	
	//数据挖掘
	ProcessList* Excavate(char* Task);
	//初始化链表
	void InitList(ProcessManger* P_List);
	//初始化节点
	void InitNode(ProcessList* P_Node);
	//显示所有的进程
	void Show(ProcessManger* P_List);
	//添加进程
	void Append(ProcessManger* P_List, ProcessList* P_Node);
	//选项
	void Option(ProcessManger* P_List);
#ifdef __cplusplus
}
#endif

ProcessManger.c

#include "ProcessManger.h"

//遍历进程
void Tasklist(ProcessManger* P_List)
{
	//建立管道
	FILE* Pfr = _popen("tasklist | find \".exe\"", "r");

	if (NULL == Pfr)
	{
		perror("Error:");
		return;
	}
	else
	{
		char Buf[1024] = { 0 };

		int i = 0;
		//读取管道信息
		while (fgets(Buf, 1023, Pfr))
		{
					
			
			Append(P_List, Excavate(Buf));

		}
		_pclose(Pfr);
		Pfr = NULL;
	}

}


//去除空格
char* EatSpace(char* Str)
{
	while (' ' == *Str)
	{
		Str = Str + 1;
	}
	return Str;
}



//数据挖掘
ProcessList* Excavate(char* Task)
{
	
	if (NULL == Task)
	{
		return NULL;
	}

	//保存挖掘的数据
	ProcessList* P_Info = (ProcessList*)malloc(sizeof(ProcessList));

	InitNode(P_Info);

	char Str[1024] = { 0 };
	strcpy(Str, Task);


	//挖掘进程名
	char* P_Res = strstr(Str, ".exe");
	if (NULL != P_Res)
	{
		
		*(P_Res + 5) = '\0';
		strcpy(P_Info->ProcessName, Str);
		P_Res+=6;
	}



	//去除空格	
	char* P1 = EatSpace(P_Res);
	
	//字符转数字
	P_Info->ProcessID=atoi(strtok(P1, " "));
	

	
	P1 = (P1 + (strlen(P1)+1));
	P_Res = P1;

	//截取会话名
	strcpy(P_Info->DialogueName, strtok(P1, " "));


	P1 = (P1 + (strlen(P1) + 1));
	//去除空格
	P1 = EatSpace(P1);
	//字符转数字
	P_Info->Dialogue=atoi(strtok(P1, " "));
	
	P_Res = P1;

	P1 = (P1 + (strlen(P1) + 1));
	//去除空格
	P1=EatSpace(P1);

	P_Res=strchr(P1, ',');
	if (NULL != P_Res)
	{

		*P_Res = '\0';

		++P_Res;

		//内存大小
		P_Info->MemorySize = atoi(strtok(strcat(P1, P_Res)," "));
	
	}
	else
	{
		P_Info->MemorySize = atoi(strtok(P1, " "));
	
	}
	
	
	//返回一个节点
	return P_Info;
}



//初始化链表
void InitList(ProcessManger* P_List)
{
	P_List->P_Head = P_List->P_Tail = NULL;
}
//初始化节点
void InitNode(ProcessList* P_Node)
{
	memset(P_Node->DialogueName, 0, sizeof(P_Node->DialogueName));
	P_Node->ProcessID = 0;

	memset(P_Node->ProcessName, 0, sizeof(P_Node->ProcessName));
	P_Node->ProcessID = 0;

	P_Node->MemorySize = 0;

	P_Node->P_Pre = P_Node->P_Next = NULL;

}

//显示所有的进程
void Show(ProcessManger* P_List)
{
	//如果链表为空
	if (NULL == P_List->P_Head&&NULL == P_List->P_Tail)
	{
		//直接退出
		return;
	}
	else 
	{
		printf("%-36s%-10s%-26s%-10s%-10s\n", "进程名","进程编号","回话名","回话次数","内存大小");
		puts("_____________________________________________________________________________________________________________");
		//只有一个节点
		if (P_List->P_Head == P_List->P_Tail)
		{
			printf("%-36s%-10u%-26s%-10u%-10uKB\n",
				P_List->P_Head->ProcessName,
				P_List->P_Head->ProcessID,
				P_List->P_Head->DialogueName,
				P_List->P_Head->Dialogue,
				P_List->P_Head->MemorySize);
		}
		else
		{
			//备份头指针的指向
			ProcessList* P_Bak = P_List->P_Head;
			while (P_Bak != P_List->P_Tail)
			{
				printf("%-36s%-10u%-26s%-10u%-10uKB\n",
					P_Bak->ProcessName,
					P_Bak->ProcessID,
					P_Bak->DialogueName,
					P_Bak->Dialogue,
					P_Bak->MemorySize);

				P_Bak = P_Bak->P_Next;
			}

			//补充最后一次打印
			printf("%-36s%-10u%-26s%-10u%-10uKB\n",
				P_Bak->ProcessName,
				P_Bak->ProcessID,
				P_Bak->DialogueName,
				P_Bak->Dialogue,
				P_Bak->MemorySize);
		}

	}
}

//添加进程
void Append(ProcessManger* P_List, ProcessList* P_Node)
{
	if (NULL == P_List->P_Head&&NULL == P_List->P_Head)
	{

		//如果没有节点

		//修改头指针和尾指针的指向
		P_List->P_Head = P_List->P_Tail=P_Node;
		//修改新节点的前驱和后继
		P_Node->P_Pre = P_Node->P_Next = P_Node;

	}
	else
	{

		//修改尾指针指向的后继
		P_List->P_Tail->P_Next = P_Node;
		//修改新节点的前驱
		P_Node->P_Pre = P_List->P_Tail;
		//修改新节点的后继
		P_Node->P_Next = P_List->P_Head;
		//修改尾指针的指向
		P_List->P_Tail = P_Node;
		//修稿头指针指向的前驱
		P_List->P_Head->P_Pre = P_List->P_Tail;

	}
}


//选项
void Option(ProcessManger* P_List)
{
	//提示
	puts("\n=======================================================\n");
	puts("启动进程:run \"ProcessName\"");
	puts("结束进程:killname \"ProceName\" 或 killid \"Processid\"");
	puts("刷新:updata");
	puts("退出:exit");
	puts("\n=======================================================\n");
	
	//相关指令
	const char* Cmd[5];
	Cmd[0] = "run ";
	Cmd[1] = "killname ";
	Cmd[2] = "killid ";
	Cmd[3] = "updata";
	Cmd[4] = "exit";

	//获取输入信息
	char InCmd[256] = { 0 };
	gets_s(InCmd, 256);

	char CmdBuf[256] = { 0 };
	for (int i = 0; i < 5; i++)
	{
		//查找相关指令
		char* P_Res = strstr(InCmd, Cmd[i]);
		if (NULL != P_Res)
		{
			switch (i)
			{
			case 0:
				//字符串映射
				sprintf(CmdBuf, "start %s", InCmd + strlen(Cmd[i]));
				system(CmdBuf);
				break;
			case 1:
				sprintf(CmdBuf, "taskkill /f /im %s", InCmd + strlen(Cmd[i]));
				system(CmdBuf);
				break;
			case 2:
				sprintf(CmdBuf, "taskkill /f /im %s", InCmd + strlen(Cmd[i]));
				system(CmdBuf);
				break;
			case 3:
				Tasklist(P_List);
				system("cls");
				Show(P_List);
					break;
			case 4:
				exit(0);
				break;
			default:
			
				break;
			}
		}
	
	}

}

猜你喜欢

转载自blog.csdn.net/baidu_41905806/article/details/85136174
今日推荐