linux 函数定义与调用

linux 函数定义与调用,第1张

linux shell函数定义语法有2种,如下:

注:

函数返回值有2种方式,如下:

注:

使用反引号“``”,获取函数最后一条命令运行结果,并将该运行结果输出赋予某一变量,如:

注:

无参函数调用直接使用函数名调用即可,如:

有参函数调用和无参调用类似,直接在函数名后加上参数即可,多个参数用空格隔开,如:

注:

本文介绍Linux内核内存分配函数: kzalloc() 和 kcalloc() 。

文件: include/linux/slab.h ,定义如下:

kzalloc() 函数功能同 kmalloc() 。区别:内存分配成功后清零。

每次使用 kzalloc() 后,都要有对应的内存释放函数 kfree() 。

举例:

文件: include/linux/slab.h ,定义如下:

kcalloc() 函数为数组分配内存,大小 n*size ,并对分配的内存清零。该函数的最终实现类似 kmalloc() 函数。

每次使用 kcalloc() 后,都要有对应的内存释放函数 kfree() 。

举例:

最近工作中在 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 用起来,看则简单,实则不那么简单,有很多隐藏的坑,需要自己深入理解原理,才能更好地使用,也可以用其他实现方式完成相同的功能。

最后对自己说,多写,多思,多总结


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/6270502.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-19
下一篇 2023-03-19

发表评论

登录后才能评论

评论列表(0条)

保存