
最近工作中在 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 用起来,看则简单,实则不那么简单,有很多隐藏的坑,需要自己深入理解原理,才能更好地使用,也可以用其他实现方式完成相同的功能。
最后对自己说,多写,多思,多总结
函数名: sleep、usleep功 能: 执行挂起一段时间
头文件: #include <unistd.h>
区 别: unsigned sleep (unsigned int seconds)//n秒
int usleep (useconds_t usec)//n微秒
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<unistd.h>
int main()
{
intsec = 0,
usec = 0
while(1)
{
printf("sec = %d \n",++sec)
sleep(1)
printf("usec = %d \n",++usec)
usleep(1000000)
}
return 0
}
Linux下的sleep函数原型为:
unsigned int sleep(unsigned int seconds)
而MFC中的Sleep函数原型为:
void Sleep(DWORD dwMilliseconds)
也就是说,Linux下(使用的gcc的库),sleep()函数是以秒为单位的,sleep(1)就是休眠1秒。而MFC下的Sleep()函数是以毫秒为单位的,sleep(1000)才是休眠1秒。而如果在Linux下也用微妙为单位休眠,可以使用线程休眠函数:void usleep(unsigned long usec)。
Linux下还有个delay()函数,原型为extern void delay(unsigned int msec)它可以延时msec*4毫秒,也就是如果想延时一秒钟的话,可以这么用 delay(250)。
首先看看time 的原型:time_t time(time_t *calptr) //其说明是:若成功则返回时间值,否则返回-1。时间值总是作为函数值返回。如果参数不为空(NULL),则时间值也存放在由calptr指向的单元内。(看似的确多余的,仅仅是看似~~)
第二个函数的原型:
struct tm *localtime(const time_t *calptr)//看到了把~参数是指针,所以必须要传递地址,&t取地址。 (顺带提一下~localtime是将日历时间转换成本地时间,会考虑到本地时区和夏时制标志,而与此类似的一个函数gmtime则是将日历时间转换成国际标准时间)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)