由于要在STB中实现待机,需要kill掉一些进程 ,这里采用的是先ps查出有哪些进程,并保存到文件,然后把该kill掉的进程kill掉,还没有做好。部分kill的代码:
#include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <malloc.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <cutils/log.h> #define PATH_MAX 128 #define PROCESS_RESERVER_NUM 58 char reserve_process[PROCESS_RESERVER_NUM][64] = { "/init", "kthreadd", "ksoftirqd/0", "watchdog/0", "events/0", "khelper", "async/mgr", "sync_supers", "bdi-default", "kblockd/0", "ata_aux", "ata_sff/0", "khubd", "kseriod", "kgameportd", "kmmcd", "cfg80211", "rpciod/0", "khungtaskd", "kswapd0", "aio/0", "nfsiod", "crypto/0", "scsi_eh_0", "mtdblock0", "mtdblock1", "mtdblock2", "mtdblock3", "mtdblock4", "mtdblock5", "mtdblock6", "mtdblock7", "mtdblock8", "mtdblock9", "mtdblock10", "mtdblock11", "mtdblock12", "mtdblock13", "mtdblock14", "wusbd", "kpsmoused", "kstriped", "usbhid_resumer", "binder", "l2cap", "krfcommd", "yaffs-bg-1", "yaffs-bg-1", "yaffs-bg-1", "/system/bin/sh", "/system/bin/irkeyservice", "logcat", "zygote", "flush-31:6", "system_server", "galcore", "/system/bin/hdmi" }; typedef struct { char user[32]; char pid[10]; char ppid[10]; char vsize[10]; char rss[10]; char wchan[10]; char pc[10]; char s[10]; char process_name[64]; } PS_INFO_T; pthread_mutex_t mutex[1]; int check_process_reserve(char *process_name) { int i = 0; LOGI("process_name = %s", process_name); for(i = 0; i < PROCESS_RESERVER_NUM; i++) if(memcmp(reserve_process[i], process_name, strlen(process_name)) == 0) return 1; return -1; } /* reads a file, making sure it is terminated with \n \0 */ void *read_file(const char *fn, unsigned *_sz) { char *data; int sz; int fd; data = 0; fd = open(fn, O_RDONLY); if(fd < 0) { printf("open %s fail\n", fn); return 0; } printf("fd = %d\n", fd); sz = lseek(fd, 0, SEEK_END); printf("sz = %d\n", sz); if(sz < 0) goto oops; if(lseek(fd, 0, SEEK_SET) != 0) goto oops; data = (char*) malloc(sz + 2); if(data == 0) goto oops; if(read(fd, data, sz) != sz) goto oops; close(fd); data[sz] = '\n'; data[sz+1] = 0; if(_sz) *_sz = sz; printf("read_file success\n"); return data; oops: close(fd); printf("read_file fail\n"); if(data != 0) free(data); return 0; } char *mydata = NULL; char * parse_next_process(char *data, PS_INFO_T *p_info) { char *p = NULL; pthread_mutex_lock(mutex); LOGI("Enter parse_next_process--------------------------"); while(*data == ' ' || *data == '\n') data++; p = data; while(*data != ' ')data++; memcpy(p_info->user, p, data - p ); //user p_info->user[data - p ] = '\0'; while(*data == ' ' || *data == '\n') data++; p = data; while(*data != ' ')data++; memcpy(p_info->pid, p, data - p);//pid p_info->pid[data - p] = '\0'; while(*data == ' ' || *data == '\n') data++; p = data; while(*data != ' ')data++; memcpy(p_info->ppid, p, data - p);//ppid while(*data == ' ' || *data == '\n') data++; p = data; while(*data != ' ')data++; memcpy(p_info->vsize, p, data - p);//vsize while(*data == ' ' || *data == '\n') data++; p = data; while(*data != ' ')data++; memcpy(p_info->rss, p, data - p);//rss while(*data == ' ' || *data == '\n') data++; p = data; while(*data != ' ')data++; memcpy(p_info->wchan, p, data - p);//wchan while(*data == ' ' || *data == '\n') data++; p = data; while(*data != ' ')data++; memcpy(p_info->pc, p, data - p);//pc while(*data == ' ' || *data == '\n') data++; p = data; while(*data != ' ')data++; memcpy(p_info->s, p, data - p);//s while(*data == ' ' || *data == '\n') data++; p = data; while(*data != ' ' && *data != '\n')data++; memcpy(p_info->process_name, p, data - p);//process_name p_info->process_name[data - p ] = '\0'; if(*data != '\n') { LOGI("process name have space");//进程名有空格 while( *data != '\n')data++; } LOGI("Exit parse_next_process------------------------------pid = %d",getpid()); pthread_mutex_unlock(mutex); return data; } int main(int argc, char *argv[]) { int i, rv, pid_t[128]; int status = 0; char *p = NULL; int pid = -1; PS_INFO_T ps_info; pthread_mutex_init(mutex, NULL); pid = fork(); printf("pid = %d\n", pid); LOGI("rv = %d.\n", rv); if(pid == 0) { rv = execl("/system/bin/sh", "/system/bin/sh", "/system/etc/ps.sh", (char*)0); LOGI("rv1 = %d \n", rv); exit(0); return 0; } else { sleep(1); while(waitpid(pid, &status, 0) < 0) { printf( "waitpid error pid:%d \n", pid); break; } mydata = read_file("/ps.log", 0); p = &mydata[61];//去掉第一行 while(p) { p = parse_next_process(p, &ps_info); if(memcmp("ps", ps_info.process_name, strlen(ps_info.process_name)) == 0) { LOGI("Exit process"); break; } pid = fork(); if(pid == 0) { if(check_process_reserve(ps_info.process_name) != 1) { LOGI("find process %s, pid = %s not reserve", ps_info.process_name, ps_info.pid); rv = execl("/system/bin/kill", "/system/bin/kill", ps_info.pid, (char*)0); LOGI("rv = %d\n", rv); } exit(0); return 0; } else { while(waitpid(pid, &status, 0) < 0) { printf( "waitpid error pid:%d \n", pid); break; } } } } LOGI("Exit Main \n"); return 0; }