本期给大家介绍了一下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文章
8486浏览量
150805 -
Linux
+关注
关注
87文章
11219浏览量
208872 -
System
+关注
关注
0文章
165浏览量
36877 -
C语言
+关注
关注
180文章
7597浏览量
136117
发布评论请先 登录
相关推荐
C语言使用函数调用的知识点
C语言使用函数调用,我们再熟悉不过了,但是函数调用在内存中究竟发生了什么真的清楚吗?只有搞清楚内存里的内幕,才算完全搞懂函数的
发表于 09-07 11:47
•806次阅读
请问为什么要在Linux下学习C语言?
接触到的都是肤浅的表面。C语言就那么几个语法吗?你这一行语句写下去以后编译器到底干了什么?他到底做了哪些优化?变量在内存中到底是一种怎样的存在?编译器真的会按照
发表于 06-24 14:25
Linux下C语言编程入门教程
编程风格等。u3000u3000Linux 作为一个优秀的操作系统,一项非常重要的功能就是支持系统调用尤其是支持C语言的系统调用功能十分的方
发表于 09-22 06:56
需要深入了解linux下的system()函数
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命>令执行完后随即返回原
发表于 05-05 15:00
•3188次阅读
你知道Linux系统调用的原理
系统调用是应用程序与操作系统内核之间的接口,它决定了程序如何与内核打交道的。无论程序是直接进行系统调用,还是通过运行库,最终还是会到达系统调用这个层面上
发表于 05-16 16:21
•1482次阅读
linux c使用system调用shell脚本
system的原理其实就是调用fork创建子进程去执行shell命令,然后返回最后一条shell命令的状态值。linux下man system可以看到返回值说明: 1.
发表于 04-02 14:41
•1274次阅读
如何区分xenomai、linux系统调用/服务
对于同一个POSIX接口应用程序,可能既需要xenomai内核提供服务(xenomai 系统调用),又需要调用linux内核提供服务(linux
C语言使用函数调用在内存中究竟发生了什么?
C语言使用函数调用,我们再熟悉不过了,但是函数调用在内存中究竟发生了什么真的清楚吗?只有搞清楚内存里的内幕,才算完全搞懂函数的
深入探索Linux中的C语言
本章将深入探索 Linux 中的 C 语言。在本章中,我们将学到更多关于编译器、从源码到二进制程序的 4 个步骤、如何使用 Make 工具以及系统调用和
评论