本期给大家介绍了一下Linux下system()函数的正确用法!
废话不多说,相信你肯定也在system接口上填过坑!先上一把它的正确操作:
#include
#include
#define Debuging(fmt, arg...) printf(fmt, ##arg)
int new_system(char *cmd, char *resultout, int buflen, int *lenout)
{
int status = system(cmd);
Debuging("cmd=%s\n", cmd);
if (-1 == status)
{
Debuging("system error!\n");
}
else
{
Debuging("exit status value = [0x%x]\n", status);
if (WIFEXITED(status))
{
if (0 == WEXITSTATUS(status))
{
Debuging("run shell script successfully.\n");
return 0;
}
else
{
Debuging("run shell script fail, script exit code: %d\n", WEXITSTATUS(status));
}
}
else
{
Debuging("exit status = [%d]\n", WEXITSTATUS(status));
}
}
return -1;
}
示例代码中很好地展示了,如何判断system接口的返回值!
以下是linux man中关于system接口的介绍:
SYSTEM(3) Linux Programmer's Manual SYSTEM(3)
NAME
system - execute a shell command
SYNOPSIS
#include
int system(const char *command);
DESCRIPTION
The system() library function uses fork(2) to create a child process that executes the shell command specified in command using
execl(3) as follows:
execl("/bin/sh", "sh", "-c", command, (char *) 0);
system() returns after the command has been completed.
During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored, in the process that calls system()
(these signals will be handled according to their defaults inside the child process that executes command).
If command is NULL, then system() returns a status indicating whether a shell is available on the system
RETURN VALUE
The return value of system() is one of the following:
* If command is NULL, then a nonzero value if a shell is available, or 0 if no shell is available.
* If a child process could not be created, or its status could not be retrieved, the return value is -1.
* If a shell could not be executed in the child process, then the return value is as though the child shell terminated by calling
_exit(2) with the status 127.
* If all system calls succeed, then the return value is the termination status of the child shell used to execute command. (The
termination status of a shell is the termination status of the last command it executes.)
In the last two cases, the return value is a "wait status" that can be examined using the macros described in waitpid(2). (i.e.,
WIFEXITED() WEXITSTATUS() and so on).
system() does not affect the wait status of any other children.
ATTRIBUTES
For an explanation of the terms used in this section, see attributes(7).
┌──────────┬───────────────┬─────────┐
│Interface │ Attribute │ Value │
├──────────┼───────────────┼─────────┤
│system() │ Thread safety │ MT-Safe │
└──────────┴───────────────┴─────────┘
CONFORMING TO
POSIX.1-2001, POSIX.1-2008, C89, C99.
NOTES
system() provides simplicity and convenience: it handles all of the details of calling fork(2), execl(3), and waitpid(2), as well as
the necessary manipulations of signals; in addition, the shell performs the usual substitutions and I/O redirections for command.
The main cost of system() is inefficiency: additional system calls are required to create the process that runs the shell and to
execute the shell.
If the _XOPEN_SOURCE feature test macro is defined (before including any header files), then the macros described in waitpid(2)
(WEXITSTATUS(), etc.) are made available when including .
As mentioned, system() ignores SIGINT and SIGQUIT. This may make programs that call it from a loop uninterruptible, unless they
take care themselves to check the exit status of the child. For example:
while (something) {
int ret = system("foo");
if (WIFSIGNALED(ret) &&
(WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))
break;
}
Do not use system() from a program with set-user-ID or set-group-ID privileges, because strange values for some environment vari‐
ables might be used to subvert system integrity. Use the exec(3) family of functions instead, but not execlp(3) or execvp(3). sys‐
tem() will not, in fact, work properly from programs with set-user-ID or set-group-ID privileges on systems on which /bin/sh is bash
version 2, since bash 2 drops privileges on startup. (Debian uses a modified bash which does not do this when invoked as sh.)
In versions of glibc before 2.1.3, the check for the availability of /bin/sh was not actually performed if command was NULL; instead
it was always assumed to be available, and system() always returned 1 in this case. Since glibc 2.1.3, this check is performed
because, even though POSIX.1-2001 requires a conforming implementation to provide a shell, that shell may not be available or exe‐
cutable if the calling program has previously called chroot(2) (which is not specified by POSIX.1-2001).
It is possible for the shell command to terminate with a status of 127, which yields a system() return value that is indistinguish‐
able from the case where a shell could not be executed in the child process.
SEE ALSO
sh(1), sigaction(2), sigprocmask(2), fork(2), wait(2), exec(3), signal(7)
COLOPHON
This page is part of release 4.04 of the Linux man-pages project. A description of the project, information about reporting bugs,
and the latest version of this page, can be found at http://www.kernel.org/doc/man-pages/.
总结:
1.Linux系统接口使用前务必了解其接口说明;
2.类似system接口,返回值为0的时候,并不代表命令一定执行成功了,这个需要特别注意;
3.读懂man说明,也是一项基本的技能。
好了,本期的介绍就到这里了,你掌握了吗?
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
接口
+关注
关注
33文章
7574浏览量
148207 -
Linux
+关注
关注
87文章
10943浏览量
206546 -
System
+关注
关注
0文章
161浏览量
36552 -
C语言
+关注
关注
180文章
7513浏览量
124276
发布评论请先 登录
相关推荐
C语言使用函数调用的知识点
C语言使用函数调用,我们再熟悉不过了,但是函数调用在内存中究竟发生了什么真的清楚吗?只有搞清楚内存里的内幕,才算完全搞懂函数的调用。
发表于 09-07 11:47
•656次阅读
[推荐]linux下的c语言编程简介
基本的了解。第二章从本章开始,我们将进入Linux充满挑战的C语言编程世界,首先介绍的是文本编辑器。文本编辑器可以说是计算机最基本的应用,修改设置文 件、编写程序或者建立文件都需要用到
发表于 04-29 13:50
电房门控开关,你真的了解吗?!
电房门控开关,你真的了解吗?!以上具体视频的链接地址: 免费的 ,http://pan.baidu.com/s/1o681lVk,不妨看看挺有用的
发表于 04-12 12:26
C 语言程序设计---必会的 Linux
、链接、执行重要的 Linux对于 Linux,我是强烈建议大家必须的会,这个是一个硬性要求技术,你说不会 Linux,真的来公司,
发表于 08-06 17:05
请问为什么要在Linux下学习C语言?
接触到的都是肤浅的表面。C语言就那么几个语法吗?你这一行语句写下去以后编译器到底干了什么?他到底做了哪些优化?变量在内存中到底是一种怎样的存在?编译器真的会按照
发表于 06-24 14:25
你真的了解快充吗?
手机快充,PD快充,125W超级快充……想必这些词或多或少都会听过吧。在电池材质没有取得新突破之前,不断提升的快充技术也是符合当下节奏更快的生活的最佳选择。但是你真的了解快充吗?快充是不是只需要一个
发表于 07-26 08:11
Linux下C语言编程入门教程
编程风格等。u3000u3000Linux 作为一个优秀的操作系统,一项非常重要的功能就是支持系统调用尤其是支持C语言的系统调用功能十分的方
发表于 09-22 06:56
需要深入了解linux下的system()函数
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命>令执行完后随即返回原调用的进程。
发表于 05-05 15:00
•2937次阅读
linux c使用system调用shell脚本
system的原理其实就是调用fork创建子进程去执行shell命令,然后返回最后一条shell命令的状态值。linux下man system可以看到返回值说明: 1.
发表于 04-02 14:41
•1148次阅读
评论