linux下使用C语言编写管理进程

最近想在linux下写一个进程管理程序,在网上找到了这篇文章,真的不错

文章出处:http://blog.163.com/lixiangqiu_9202/blog/static/5357503720123924235406/

其他相关的文章还有:http://blog.csdn.net/bulreed/article/details/6682811

http://www.cnblogs.com/shiweifu/archive/2012/02/21/2360817.html


使用linux算是有一段时间了吧,但目前为止杀死进程都是通过ps aux | grep xxx然后再kill xxxpid来结束进程,一直以来也没想过如果使用进程名为杀死进程,也没去网上找过,在写本程序之前才发现原来可以使用pkill等来完成,但既然萌生了自己写程序的念头,于是就继续写下去了.

本程序所拥有的功能为:
               1:可以使用pid来结束进程,相关参数为-p
               2:可以通过进程名来杀死进程,相关参数为-n,此时可以杀死系统中所有与指定名称同名的进程,直到没有再发现系统中与此相同的进程名
              3:可以查看当前系统中所有运行的进程,以及它的pid和该进程的执行路径,没有参数
              4:可以查看指定进程名的pid,相关参数-l,此时若系统中有多个与此同名的进程将会被全部显示出来,直到无法再找到该进程名
              5:可以查看指定pid进程的执行路径,相关参数-L
此程序还有一个-h选项,此选项为帮助选项
程序的原理是读/proc下的相关文件加以整理得到的信息,好了下面给出程序
#include "stdio.h"
#include "stdlib.h"
#include "signal.h"
#include "sys/types.h"
#include "unistd.h"
#include "errno.h"
#include "string.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "dirent.h"
const char *PROC="/proc/";
typedef struct dirent DIRENT;
int get_info(char *what,char *file,char *filename)
{
    int fd,i=0;
    char filepath[50];
    strcpy(filepath,PROC);
    strcat(filepath,filename);
    strcat(filepath,file);
    if((fd=open(filepath,O_RDONLY))==-1)
        {
                printf("Open File %s Error:%s\n",filepath,strerror(errno));
                return 1;
        }
        while(read(fd,&what[i],sizeof(char)))
    {
        if(what[i]=='\n')
            break;
        i++;
    }
        what[i]='\0';
        close(fd);
    return 0;
}
void read_file(char *filename)
{
    char comm[50],cmd[300];
    int pid;
    get_info(comm,"/comm",filename);
    get_info(cmd,"/cmdline",filename);
    printf("Pid:%-8sName:%-16sPath:%s\n",filename,comm,cmd);
}
void display_info(void)
{
    DIR *dir;
    long i=0;
    DIRENT *dirp;
    if((dir=opendir(PROC))==NULL)
    {
        printf("Open Dir %s Error:%s\n",PROC,strerror(errno));
        exit(1);
    }
    while((dirp=readdir(dir))!=NULL)
    {
        if(strcmp(dirp->d_name,"1")==0)
            break;
        i++;
    }
    seekdir(dir,i);
    while((dirp=readdir(dir))!=NULL)
        read_file(dirp->d_name);
    closedir(dir);
}
void killbypid(char *pid_s)
{
    int pid;
    pid=atoi(pid_s);
    if(kill(pid,SIGKILL)==-1)
    {
        printf("Kill %s Error:%s\n",pid_s,strerror(errno));
        exit(1);
    }
}
int get_pid(char *filename,int *pid)
{
    DIR *dir;
    char comm[50];
    DIRENT *dirp;
    int flags=0,i=0;
    if((dir=opendir(PROC))==NULL)
    {
        printf("Open %s Error %s\n",PROC,strerror(errno));
        exit(1);
    }
    while((dirp=readdir(dir))!=NULL)
    {
        if(strcmp(dirp->d_name,"1")==0)
            break;
        i++;
    }
    seekdir(dir,i);
    while((dirp=readdir(dir))!=NULL)
    {
        get_info(comm,"/comm",dirp->d_name);
        if(strcmp(comm,filename)==0)
        {
            if(pid==NULL)
            {
                printf("%s Pid is:%s\n",filename,dirp->d_name);
                continue;    
            }
            else
                *pid=atoi(dirp->d_name);
            flags=1;
            closedir(dir);
            return 1;
        }
    }
    if(flags==0)
    {
        printf("Cannot Find %s\n",filename);
        exit(1);
    }
    return 0;
}
void killbyname(char *filename)
{
    int pid;
    while(get_pid(filename,&pid))
    {
        printf("%s\t%d\n",filename,pid);
        if(kill(pid,SIGKILL)==-1)
        {
            printf("Kill %s Error:%s\n",filename,strerror(errno));
            exit(1);
        }
    }
}
void help(void)
{
    printf("\t\t   *****************my_kill*****************\n");
    printf("\t\t   *  -p:使用pid来结束进程               *\n");
    printf("\t\t   *  -n:使用进程名称来结束进程      *\n");
    printf("\t\t   *  -l:查看指定进程名的pid             *\n");
    printf("\t\t   *  -h:帮助                                      *\n");
    printf("\t\t   *  -L:查看指定pid的进程执行路径  *\n");
    printf("\t\t   *  无参数时显示当前系统所有进程*\n");
    printf("\t\t   *****************my_kill*****************\n");
}
void get_pid_in_path(char *filename)
{
    char cmd[300];
    if(get_info(cmd,"/cmdline",filename)==0)
        printf("The Pid %s Path is %s\n",filename,cmd);
}
int main(int argc,char **argv)
{
    if(argc==1)
        display_info();
    else if((strcmp(argv[1],"-p")==0)&&argc==3)
        killbypid(argv[2]);
    else if((strcmp(argv[1],"-n")==0)&&argc==3)
        killbyname(argv[2]);
    else if((strcmp(argv[1],"-l")==0)&&argc==3)
        while(get_pid(argv[2],NULL));
    else if((strcmp(argv[1],"-h")==0)&&argc==2)
        help();
    else if((strcmp(argv[1],"-L")==0)&&argc==3)
        get_pid_in_path(argv[2]);
    else
        printf("参数错误!\n");
    return 0;
}
get_pid函数写得比较蛋痛,请原谅我没有太注意格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值