system函数 linux system函数返回值

大家好,今天给各位分享system函数 linux的一些知识,其中也会对system函数返回值进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

Linux下的system函数应该这样用

在Linux编程中,system函数常常被用来执行shell命令,它便捷易用。然而,正确使用system函数需要特别留意一些细节。首先,让我们理解system函数的基本信息。在头文件#include后,函数原型为int system(const char*command)。其工作原理是:当调用system时,内核会在子进程结束后向父进程发送SIGCHLD信号,父进程通常通过waitpid回收子进程并获取其结束状态。

关键点在于,不能在system调用前后直接处理SIGCHLD信号,比如在信号处理函数中执行wait操作。这样可能导致system函数无法获取子进程的正确返回状态,因为子进程可能在信号处理函数处理时被提前回收。为了避免这个问题,一种实践做法是使用信号处理模板,先将SIGCHLD信号的处理设为SIG_DFL(忽略),这样在调用system前不会干扰子进程的回收,调用完毕后恢复原来的处理函数。示例如下:

在项目中,推荐的system调用封装如下:

在调用system前,首先将SIGCHLD信号的处理设为默认忽略:

old_handler= signal(SIGCHLD, SIG_DFL);

然后执行system函数:

system(...);

调用结束后,恢复原始信号处理函数:

signal(SIGCHLD, old_handler);

Linux system 函数

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

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

C语言中system("pause")是什么作用和意思

system("pause")意思就是让程序暂停一下,然后按任意键继续,初学的时候最多见于程序的末尾处,用于看运行结果,避免程序一闪而过。相同的我们还可以用getchar(),避免程序运行完直接结束而看不到运行结果。

如下图:

执行到 system("pause");按任意键继续

贴上代码:

#include<stdio.h>

void main()

{

printf("haha哈哈\n");

system("pause");

printf("haha哈哈\n");

system("pause");

}

扩展资料:

函数名: system

功能:发出一个DOS命令

用法: int system(char*command);

system函数已经被收录在标准c库中,可以直接调用。

阅读剩余
THE END