C语言里有个popen函数,用来捕获shell里命令的输出,这样C和shell也可以相互通信了。
popen()函数原型如下:
FILE *popen(const char *cmd,const char *type);
返回值:若成功返回文件指针,出错则返回NULL
功能:创建一个管道,fork一个子进程,接着关闭管道的不使用端,子进程执行cmd指向的应用程序或者命令。
执行完该函数后父进程和子进程之间生成一条管道,函数返回值为FILE结构指针,该指针作为管道的一端,为父进程所拥有。子进程则拥有管道的另一端,该端口为子进程的stdin或者stdout。如果type=r,那么该管道的方向为:子进程的stdout到父进程的FILE指针;如果type=w,那么管道的方向为:父进程的FILE指针到子进程的stdin。
例1:将 "ls -l"输出结果,输出到字符数组中
int main()
{
FILE *file;
char buf[128];
file=popen("ls -l" ,"r");
fgets(buf,sizeof(buf),file);
pclose(file);
return 0;
}
例2:将想要查找的进程数量输出
char cFileName[1024];
char cTmp[1024];
memset(cFileName,0x00,sizeof(cFileName));
memset(cTmp, 0x00, sizeof(cTmp));
sprintf(cFileName, "ps -ef|grep \"/home/test/bin/Stest \" |grep -c -v grep");
FILE *fp = popen(cFileName, "r");
if (fp)
{
fgets(cTmp, sizeof(cTmp-1), fp);
pclose(fp);
}
else
return -1;
例如输出结果:1 (进程个数);