在项目过程中有这样一种需求:根据ubi的分区名字找到ubi设备文件名进行后续操作。这里有一种直接调用linux命令查找分区文件的方法,涉及了linux常用命令组合使用,linux命令默认参数,正则表达式,c语言,按照需求写出的代码如下:</span>
/***********************************************************/
/** find_ubi_name_by_partition_name
* @param char * partition_name
* @param char * ubi_name
*
* @return 0 means get ubi name success, others means failed
* @brief -get ubi name by partition name
* @author gcb @date 2015/07/13 create
************************************************************/
static int find_ubi_name_by_partition_name(char *partition_name,char *ubi_name)
{
#define UBIDEV_BASE_PATT "/sys/devices/virtual/ubi"
#define UBI_DEV "/dev/"
#define MAXCOMMAND 512
int ret =1;
if(NULL == ubi_name || NULL == partition_name)
{
return 1;
}
char command[MAXCOMMAND]={0};
char result_buf[SKYAPI_FLASH_DEV_LEN]={0};
char name[SKYAPI_FLASH_DEV_LEN]={0};
int rc = 0;
int i =0 ;
FILE *fp;
sprintf(command, " find %s -name name -type f -exec grep -rlw \"%s\" {} \\; | awk -F '/' '{for(i=1;i<=NF;i++)print $i}' | grep \"ubi[0-9]\\{1,\\}_[0-9]\\{1,\\}\" ",UBIDEV_BASE_PATT,partition_name);
fp = popen(command, "r");
if(NULL!= fp)
{
rc = fread(result_buf,sizeof(char),SKYAPI_FLASH_DEV_LEN-6,fp);
if(rc != 0)
{
if(0 == strncmp(result_buf,"ubi",3))
{
sprintf(name,"%s%s",UBI_DEV,result_buf);
for(i =0;(0 != name[i])&&(i<SKYAPI_FLASH_DEV_LEN);i++)
{
if('\r' == name[i] || '\n' == name[i] )
{
name[i] = 0;
}
}
strncpy(ubi_name,name,SKYAPI_FLASH_DEV_LEN);
ret = 0 ;
}
}
pclose(fp);
}
return ret;
}
实际上我们得到了这样一个系统命令:
find /sys/devices/virtual/ubi -name name -type f -exec grep -rlw 'hwconfig' {} \; | awk -F '/' '{for(i=1;i<=NF;i++) print $i}' | grep "ubi[0-9]\{1,\}_[0-9]\{1,\}"
这个命令先是在/sys/devices/virtual/ubi 目录下递归寻找一个含有hwconfig字段且文件名为name的文件,获取该文件的绝对路径,并把该绝对路径以'/'分割,找到其中的类似于"ubi2_3" 这样的字段,并把这个字段返回。