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;
}
}
}
}