?本期給大家介紹了一下Linux下system()函數(shù)的正確用法!
廢話不多說(shuō),相信你肯定也在system接口上填過(guò)坑!先上一把它的正確操作:
#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中關(guān)于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/.
?
總結(jié):
1.Linux系統(tǒng)接口使用前務(wù)必了解其接口說(shuō)明;
2.類似system接口,返回值為0的時(shí)候,并不代表命令一定執(zhí)行成功了,這個(gè)需要特別注意;
3.讀懂man說(shuō)明,也是一項(xiàng)基本的技能。
好了,本期的介紹就到這里了,你掌握了嗎?
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
接口
+關(guān)注
關(guān)注
33文章
9518瀏覽量
157010 -
Linux
+關(guān)注
關(guān)注
88文章
11756瀏覽量
219000 -
System
+關(guān)注
關(guān)注
0文章
166瀏覽量
38667 -
C語(yǔ)言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145551
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
怎么在C語(yǔ)言調(diào)用系統(tǒng)指令
如果需要在C語(yǔ)言調(diào)用系統(tǒng)指令,經(jīng)常使用system函數(shù),操作簡(jiǎn)單方便,很容易理解。
發(fā)表于 09-06 14:50
?870次閱讀
C語(yǔ)言使用函數(shù)調(diào)用的知識(shí)點(diǎn)
C語(yǔ)言使用函數(shù)調(diào)用,我們?cè)偈煜げ贿^(guò)了,但是函數(shù)調(diào)用在內(nèi)存中究竟發(fā)生了什么真的清楚嗎?只有搞清楚內(nèi)存里的內(nèi)幕,才算完全搞懂函數(shù)的
發(fā)表于 09-07 11:47
?1326次閱讀
請(qǐng)問(wèn)為什么要在Linux下學(xué)習(xí)C語(yǔ)言?
接觸到的都是膚淺的表面。C語(yǔ)言就那么幾個(gè)語(yǔ)法嗎?你這一行語(yǔ)句寫下去以后編譯器到底干了什么?他到底做了哪些優(yōu)化?變量在內(nèi)存中到底是一種怎樣的存在?編譯器真的會(huì)按照
發(fā)表于 06-24 14:25
你真的都懂C語(yǔ)言嗎
發(fā)展前景的技術(shù)。1.嵌入式開發(fā)作為新人,第一C語(yǔ)言,有很多人自認(rèn)為自己C語(yǔ)言很厲害,但是實(shí)際上一個(gè)從事嵌入式開發(fā)的老人,至少需要3-5年你才
發(fā)表于 12-21 08:23
Linux下C語(yǔ)言編程入門教程
編程風(fēng)格等。u3000u3000Linux 作為一個(gè)優(yōu)秀的操作系統(tǒng),一項(xiàng)非常重要的功能就是支持系統(tǒng)調(diào)用尤其是支持C語(yǔ)言的系統(tǒng)調(diào)用功能十分的方
發(fā)表于 09-22 06:56
淺談C、C++ 和 ARM 匯編語(yǔ)言之間的調(diào)用
之間的調(diào)用 本節(jié)提供一些示例,顯示如何從C++調(diào)用C和匯編語(yǔ)言代碼,以及從C和匯編
發(fā)表于 10-19 09:24
?2次下載
需要深入了解linux下的system()函數(shù)
system()會(huì)調(diào)用fork()產(chǎn)生子進(jìn)程,由子進(jìn)程來(lái)調(diào)用/bin/sh-c string來(lái)執(zhí)行參數(shù)string字符串所代表的命令,此命>令執(zhí)行完后隨即返回原
發(fā)表于 05-05 15:00
?3632次閱讀
linux c使用system調(diào)用shell腳本
system的原理其實(shí)就是調(diào)用fork創(chuàng)建子進(jìn)程去執(zhí)行shell命令,然后返回最后一條shell命令的狀態(tài)值。linux下man system可以看到返回值說(shuō)明:?1.
發(fā)表于 04-02 14:41
?1482次閱讀
如何區(qū)分xenomai、linux系統(tǒng)調(diào)用/服務(wù)
對(duì)于同一個(gè)POSIX接口應(yīng)用程序,可能既需要xenomai內(nèi)核提供服務(wù)(xenomai 系統(tǒng)調(diào)用),又需要調(diào)用linux內(nèi)核提供服務(wù)(linux
C語(yǔ)言_Linux基本命令與C語(yǔ)言基礎(chǔ)
這篇文章介紹在Linux環(huán)境下學(xué)習(xí)C語(yǔ)言搭建基本的環(huán)境過(guò)程,了解基礎(chǔ)的幾個(gè)命令使用方法,了解Linux
C語(yǔ)言使用函數(shù)調(diào)用在內(nèi)存中究竟發(fā)生了什么?
C語(yǔ)言使用函數(shù)調(diào)用,我們?cè)偈煜げ贿^(guò)了,但是函數(shù)調(diào)用在內(nèi)存中究竟發(fā)生了什么真的清楚嗎?只有搞清楚內(nèi)存里的內(nèi)幕,才算完全搞懂函數(shù)的
深入探索Linux中的C語(yǔ)言
本章將深入探索 Linux 中的 C 語(yǔ)言。在本章中,我們將學(xué)到更多關(guān)于編譯器、從源碼到二進(jìn)制程序的 4 個(gè)步驟、如何使用 Make 工具以及系統(tǒng)調(diào)用和
充電接口你真的了解嗎?
不同的類型嗎?今天,我們就來(lái)詳細(xì)了解一下USB接口的三大類型:Type-A、Type-B和Type-C。 Type-A:最常見的“USB口” 外觀特征:扁平的矩形接口,通常用于電腦、電
深入了解系統(tǒng)調(diào)用API:探索操作系統(tǒng)底層的關(guān)鍵接口
,也無(wú)法使用內(nèi)核函數(shù)。當(dāng)用戶進(jìn)程必須訪問(wèn)內(nèi)核或使用某個(gè)內(nèi)核函數(shù)時(shí),就得使用系統(tǒng)調(diào)用(System Call)。在Linux中,系統(tǒng)調(diào)用是用戶空間訪問(wèn)內(nèi)核空間的唯一途徑。 什么是系統(tǒng)
【Linux+C語(yǔ)言】你真的了解system接口的調(diào)用嗎?
評(píng)論