?本期給大家介紹了一下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文章
8575瀏覽量
151021 -
Linux
+關注
關注
87文章
11292瀏覽量
209331 -
System
+關注
關注
0文章
165瀏覽量
36929 -
C語言
+關注
關注
180文章
7604瀏覽量
136692
發布評論請先 登錄
相關推薦
C語言使用函數調用的知識點
C語言使用函數調用,我們再熟悉不過了,但是函數調用在內存中究竟發生了什么真的清楚嗎?只有搞清楚內存里的內幕,才算完全搞懂函數的
發表于 09-07 11:47
?830次閱讀
請問為什么要在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
?3216次閱讀
你知道Linux系統調用的原理
系統調用是應用程序與操作系統內核之間的接口,它決定了程序如何與內核打交道的。無論程序是直接進行系統調用,還是通過運行庫,最終還是會到達系統調用這個層面上
發表于 05-16 16:21
?1496次閱讀
linux c使用system調用shell腳本
system的原理其實就是調用fork創建子進程去執行shell命令,然后返回最后一條shell命令的狀態值。linux下man system可以看到返回值說明:?1.
發表于 04-02 14:41
?1280次閱讀
如何區分xenomai、linux系統調用/服務
對于同一個POSIX接口應用程序,可能既需要xenomai內核提供服務(xenomai 系統調用),又需要調用linux內核提供服務(linux
C語言使用函數調用在內存中究竟發生了什么?
C語言使用函數調用,我們再熟悉不過了,但是函數調用在內存中究竟發生了什么真的清楚嗎?只有搞清楚內存里的內幕,才算完全搞懂函數的
深入探索Linux中的C語言
本章將深入探索 Linux 中的 C 語言。在本章中,我們將學到更多關于編譯器、從源碼到二進制程序的 4 個步驟、如何使用 Make 工具以及系統調用和
評論