linux实用小程序,[原]Linux进程控制实用小程序(更新中)

Linux环境下编程,经常会遇到进程控制的问题,例如fork,exec以及查找,杀死进程。

下面是一些比较实用的进程控制小程序:

1.根据名称查找返回进程PID

#define PS_COMMAND "ps|grep "

//注意:不是所有平台都支持"ps -ax" 因此这里使用比较通用的"ps"

#define SCAN(buf) (sscanf(buf,"%d %s %s %s %s",pid,s[0],s[1],s[2],cmd) == 5)

int* lookupAndKillProc(char* name)

{

if(name == NULL) return -1;

FILE *fp = NULL;

char buf[256], cmd[200], s[3][32],procPID[10];

pid_t pid = 0;

int i = 0,pidCount = 0;

int max_pid = 5;

pid_t pids[max_pid];

// ps|grep name

strcpy(cmd,PS_COMMAND);

strcat(cmd,name);

//通过打开管道,接收cmd运行返回的结果

if ((fp = popen(cmd, "r")) == NULL){

return NULL;

}else{

while (pidCount < max_pid && fgets(buf, sizeof(buf), fp)){

sscanf(&buf[9],"%d",&pid);  // PID 在buf[9]~buf[14]

pids[pidCount++] = pid;  //可能有多个同名的进程存在

}

pclose(fp);

}

return pids;

}

2. 创建进程,执行命令

这里通过fork两次,避免子进程成为僵尸进程的可能。

父进程fork产生子进程后,在父进程未结束的情况下,kill子进程,则这个子进程会成为僵尸进程,

必须等父进程结束后,子进程有init进程领养,这是init进程会清楚僵尸进程,此时子进程才会彻底清除。

int runConmand(){

pid_t pid,returnPID;

int status;

//signal(SIGCHLD, sig_chld);

if((pid=fork())<0){

return -1;

}else if(pid == 0){   //first child

if((pid = fork())<0){

return -1;

}else if(pid > 0){  // parent of second child == firstchild

exit(0);

}

//sleep(2);

//in second child progress

char *suiteId = malloc(2);

if(suiteId != NULL) sprintf(suiteId,"%d",id);

if(execl("/system/bin/runNams","runNams","-runMidlet",suiteId,NULL)<0){

return -1;

}

//exit(0);

}

//in parent progress,wait for the first child

if(waitpid(pid,&status,0) != pid){

return -1;

}

// 注意: 这里返回的是第一次fork的进程ID,如何得到第二次fork的进程ID?

return pid;

}

3.杀死指定PID的进程

int killProc(int id){

int pid = id;

if(pid < 0){

return -1;

}else{

//kill(pid,SIGKILL);   //kill,ps->exist

char cmd[20];

strcpy(cmd,"kill -9 ");

char str_pid[10];

sprintf(str_pid,"%d",pid);

strcat(cmd,str_pid);

system(cmd);   //使用system命令执行kill -9 xxx,彻底结束进程

return 0;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值