在 c 或者 c++ 代码中,有时我们需要调用系统功能,例如执行一个脚本;则只能使用system() 来实现,那么怎么根据system()函数的返回值来确认,脚本是否执行成功?或者脚本是否完成所打算执行的功能呢?下面通过一个例子来说明。
1.实现功能的脚本如下, 脚本名字是 update_mcu.sh:
以下脚本是一个给mcu升级的脚本,实现了检测是否有升级包,对升级包的md5sum校验等功能;校验完成后进行升级,升级函数upgrade_mcu 有返回值,根据返回值确定是否升级成功,根据是否升级成功,返回给 system()函数不同的返回值。
这个返回值用 exit 或者 exit -1 等来体现。
#!/system/bin/sh
MCU_FIRMWARE=/data/update/mcu_app.s19
MCU_FIRMWARE_MD5=/data/update/mcu_app.s19.md5
MD5SUM_TMP=/data/update/md5sum_tmp
MD5SUM_VALUE=/data/update/md5sum_value
echo "Need update mcu version, Continue!!!"
save_md5sum=`cat $MCU_FIRMWARE_MD5`
echo "mcu save md5sum is $save_md5sum"
md5sum $MCU_FIRMWARE > $MD5SUM_TMP
busybox awk '{print $1}' $MD5SUM_TMP > $MD5SUM_VALUE
curr_app_md5sum=`cat $MD5SUM_VALUE`
echo "curr app md5sum is $curr_app_md5sum"
if [ -z $save_md5sum ];then
echo "save_md5sum is NULL; Exit!!!"
setprop vendor.update_mcu.completed -1
exit -1
fi
if [ -z $curr_app_md5sum ];then
echo "curr_app_md5sum is NULL; Exit!!!"
setprop vendor.update_mcu.completed -1
exit -1
fi
if [ "$curr_app_md5sum" == "$save_md5sum" ];then
echo "the md5sum is ok"
upgrade_mcu -p -a $MCU_FIRMWARE
RET=$?
echo "the upgrade_mcu ret is $RET"
if [ $RET -eq 0 ];then
setprop vendor.update_mcu.completed 1
echo "update mcu has over!!!"
else
setprop vendor.update_mcu.completed -1
echo "update mcu has Error!!!"
exit -1
fi
else
echo "the md5sum is Error"
setprop vendor.update_mcu.completed -1
exit -1
fi
2.C或者 C++代码里如下:
#include <stdio.h>
#include <stdlib.h>
int ret;
ret = system(sh /system/bin/update_mcu.sh);
printf("the system ret is: %d", ret);
经过测试,当脚本文件结束语句 exit 的参数不同时, system() 的返回值也不同;可以据此判断是否执行成功升级流程。
测试的几个返回值记录如下:
1. 脚本正常退出没有 exit, 或者只有 exit; 或者 exit 0 的时候;system()的返回值都是 0;表示正常结束。
2. 脚本 exit 1 退出的时候, system()返回值是 256;
3. 脚本 exit -1 退出的时候, system()返回值是 65280.
特此记录。