默认参数可将一系列简单的重载函数合成为一个。例如,下面3个重载函数
voidpoint(int,int){//...}
voidpoint(inta){returnpoint(a,4);}
voidpoint(){returnpoint(3,4);}
可以用下面的默认参数的函数来替代:
voidpoint(int=3,int=4);
最近工作中在 Linux 下,某些指定的程序需要调用指定的 shell 脚本完成指定工作,以前也曾经做过类似的功能,调用 system 函数执行指定的脚本,以前并不关心 shell 脚本是否执行成功了,现在的功能需要根据 shell 脚本执行成功与否,于是查询了下 system 函数的说明,有此文以做笔记之用。
功能:调用/bin/sh -c 执行指定的脚本 command
常规使用方法:
关于返回值:
答案是 都错
man手册
看着挺晕的,但是如果对于 system 的执行过程了解的话,就很容易理解了,函数执行分为以下几个阶段。
阶段1:创建子进程等准备工作。如果失败,返回-1
阶段2:调用 /bin/sh 拉起脚本,如果拉起失败或者shell未正常执行,原因值被写入ret中
阶段3:如果 shell 脚本执行成功, shell 脚本的返回值写入ret中
从上面可知,不管 shell 脚本返回什么值,只要调用了/bin/sh,并且执行过程没有被信号中断,都算正常结束。因为脚本是在子进程中执行的,所以要想获取脚本是否执行成功的方法只能用系统提供的两个宏。
由于我们一般在 shell 中会通过返回值判断脚本是否执行成功,成功返回0,成功返回整数。所以判断一个脚本是否执行成功,应该满足三个条件:
注意:当 shell 脚本不存在时、没有执行条件等,前两个条件也会成立,此时WEXITSTATUS(ret)为127,所以shell脚本中不能将127作为返回值,shell脚本中的异常返回值最好从1开始递增,成功返回0。
system 用起来,看则简单,实则不那么简单,有很多隐藏的坑,需要自己深入理解原理,才能更好地使用,也可以用其他实现方式完成相同的功能。
最后对自己说,多写,多思,多总结
1.gpio_set_value(unsigned gpio, int value)用来设置gpio寄存器的值2.gpio_direction_output(unsigned gpio, int value)用来设置gpio为输出功能,同时设置gpio输出的值。 一般来说,设置一个GPIO口为输出,先执行一次gpio_direction_output,然后接下来只需执行gpio_set_value就行了。 3.gpio_direction_input(unsigned gpio)用来设置gpio为输入功能 4.gpio_get_value(unsigned gpio)用来获取gpio口的输入的值 5.在使用gpio口之前,先用gpio_request(unsigned gpio, const char* label)申请gpio口的使用,若申请成功,则说明该gpio口未被使用。 6.在使用完gpio口之后,用gpio_free(unsigned gpio)释放gpio口。 7.如何获取gpio口呢,可以查看内核中对应版型的相关文件,也可以自己进行计算,比如GPIOA1的gpio为1,GPIOB2为34。 8.gpio口的通用函数接口定义在gpiolib.c文件中,声明则在gpio.h中。9 Linux上使用的C编译器是GNU C编译器10 内联函数是使用inline关键字声明的函数,也成内嵌函数,它主要的作用是解决程序的运行效率。使用内联函数的时候要注意: 1.递归函数不能定义为内联函数 2.内联函数一般适合于不存在while和switch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数。 3.内联函数只能先定义后使用,否则编译系统也会把它认为是普通函数。 4.对内联函数不能进行异常的接口声明。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)