Android(安卓)JNI层确保只有一个进程的一个实现
16lz
2021-01-25
有时需要在Android的C层中创建一个新的进程比如myServer,但是我们又不希望,同一时间有多个myServer存在。
本文介绍个方法,相当于在在后台执行"ps myServer",获取结果,进行分析,在主线程中调用。
查询一个名为myServer的进程是否存在可以这么使用:
getMyPid();
查询失败返回-1,没有这个进程返回0,如果进程存在就返回该进程的pid。
以下是代码实现。
intpidIndex(constchar*szData){charbuf[256];strcpy(buf,szData);kesyPrintf("%s\n",buf);intidx=-1;constchar*split="";char*p=strtok(buf,split);while(p!=NULL){++idx;kesyPrintf("[%d]%s\n",idx,p);if(strcmp(p,"PID")==0){returnidx;}p=strtok(NULL,split);}return-1;}staticconstchar*getSubStr(constchar*szData,intidx,char*szRet){if(idx<0){returnszRet;}charbuf[1024];strncpy(buf,szData,sizeof(buf));buf[sizeof(buf)-1]='0';constchar*split="";char*p=strtok(buf,split);intn=0;while(p!=NULL){if(idx==n){returnstrcpy(szRet,p);}//kesyPrintf("[%d]%s\n",n,p);p=strtok(NULL,split);++n;}returnszRet;}//返回myServer的进程id//查询失败返回-1//没有这个进程返回0staticpid_tgetMyPid(){FILE*stream;/*Openingaread-onlychanneltolscommand.*/chartmpCmd[256];sprintf(tmpCmd,"ps%s","myServer");stream=popen(tmpCmd,"r");if(NULL==stream){kesyPrintf("Unabletoexecutethecommand.");return-1;}else{charbuffer[1024];intstatus;intline=0;intpidIdx=-1;/*Readeachlinefromcommandoutput.*/while(NULL!=fgets(buffer,1024,stream)){//分析结果kesyPrintf("read:%s\n",buffer);if(0==line){pidIdx=pidIndex(buffer);}else{charszPid[64];charszRet[64];strcpy(szPid,getSubStr(buffer,pidIdx,szRet));gMyPid=atoi(szPid);}line++;}/*Closethechannelandgetthestatus.*/status=pclose(stream);kesyPrintf("psexitedwithstatus%d\n",status);returngMyPid;}}
欢迎评论。
------------------ byjacksonke
更多相关文章
- 如何在后台运行Linux命令?
- 一款霸榜 GitHub 的开源 Linux 资源监视器!
- Android(安卓)启动过程框架
- 慎用原生MediaPlayer类播放音频
- Android应用开发以及设计思想深度剖析(4)
- Android5.1.1源码 - zygote fork出的子进程如何权限降级
- Android下的Service的基本用法
- 游走Android系列之Service
- Android(安卓)开发中踩过的坑之八:多进程问题