0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【Linux+C語言】你真的了解system接口的調(diào)用嗎?

嵌入式物聯(lián)網(wǎng)開發(fā) ? 來源:嵌入式物聯(lián)網(wǎng)開發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開發(fā) ? 2022-09-12 16:33 ? 次閱讀

?本期給大家介紹了一下Linux下system()函數(shù)的正確用法!

廢話不多說,相信你肯定也在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中關(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ù)必了解其接口說明;

2.類似system接口,返回值為0的時候,并不代表命令一定執(zhí)行成功了,這個需要特別注意;

3.讀懂man說明,也是一項基本的技能。


好了,本期的介紹就到這里了,你掌握了嗎?

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8447

    瀏覽量

    150722
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11207

    瀏覽量

    208721
  • System
    +關(guān)注

    關(guān)注

    0

    文章

    165

    瀏覽量

    36847
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7594

    瀏覽量

    135862
收藏 人收藏

    評論

    相關(guān)推薦

    怎么在C語言調(diào)用系統(tǒng)指令

    如果需要在C語言調(diào)用系統(tǒng)指令,經(jīng)常使用system函數(shù),操作簡單方便,很容易理解。
    發(fā)表于 09-06 14:50 ?534次閱讀

    C語言使用函數(shù)調(diào)用的知識點

    C語言使用函數(shù)調(diào)用,我們再熟悉不過了,但是函數(shù)調(diào)用在內(nèi)存中究竟發(fā)生了什么真的清楚嗎?只有搞清楚內(nèi)存里的內(nèi)幕,才算完全搞懂函數(shù)的
    發(fā)表于 09-07 11:47 ?795次閱讀

    請問為什么要在Linux下學(xué)習(xí)C語言?

    接觸到的都是膚淺的表面。C語言就那么幾個語法嗎?這一行語句寫下去以后編譯器到底干了什么?他到底做了哪些優(yōu)化?變量在內(nèi)存中到底是一種怎樣的存在?編譯器真的會按照
    發(fā)表于 06-24 14:25

    真的都懂C語言

    發(fā)展前景的技術(shù)。1.嵌入式開發(fā)作為新人,第一C語言,有很多人自認(rèn)為自己C語言很厲害,但是實際上一個從事嵌入式開發(fā)的老人,至少需要3-5年
    發(fā)表于 12-21 08:23

    LinuxC語言編程入門教程

    編程風(fēng)格等。u3000u3000Linux 作為一個優(yōu)秀的操作系統(tǒng),一項非常重要的功能就是支持系統(tǒng)調(diào)用尤其是支持C語言的系統(tǒng)調(diào)用功能十分的方
    發(fā)表于 09-22 06:56

    淺談C、C++ 和 ARM 匯編語言之間的調(diào)用

    之間的調(diào)用 本節(jié)提供一些示例,顯示如何從C++調(diào)用C和匯編語言代碼,以及從C和匯編
    發(fā)表于 10-19 09:24 ?2次下載

    需要深入了解linux下的system()函數(shù)

    system()會調(diào)用fork()產(chǎn)生子進(jìn)程,由子進(jìn)程來調(diào)用/bin/sh-c string來執(zhí)行參數(shù)string字符串所代表的命令,此命>令執(zhí)行完后隨即返回原
    發(fā)表于 05-05 15:00 ?3170次閱讀

    知道Linux系統(tǒng)調(diào)用的原理

    系統(tǒng)調(diào)用是應(yīng)用程序與操作系統(tǒng)內(nèi)核之間的接口,它決定了程序如何與內(nèi)核打交道的。無論程序是直接進(jìn)行系統(tǒng)調(diào)用,還是通過運(yùn)行庫,最終還是會到達(dá)系統(tǒng)調(diào)用這個層面上
    發(fā)表于 05-16 16:21 ?1472次閱讀
    <b class='flag-5'>你</b>知道<b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>調(diào)用</b>的原理

    linux c使用system調(diào)用shell腳本

    system的原理其實就是調(diào)用fork創(chuàng)建子進(jìn)程去執(zhí)行shell命令,然后返回最后一條shell命令的狀態(tài)值。linux下man system可以看到返回值說明:?1.
    發(fā)表于 04-02 14:41 ?1273次閱讀

    LinuxC語言編程入門教程詳細(xì)說明

    本文是LinuxC 語言編程入門教程。主要介紹了Linux 的發(fā)展與特點、C語言的基礎(chǔ)知識、
    發(fā)表于 08-25 18:05 ?39次下載
    <b class='flag-5'>Linux</b>下<b class='flag-5'>C</b><b class='flag-5'>語言</b>編程入門教程詳細(xì)說明

    C語言C++相互調(diào)用

    接口的問題,比如最常用的C++調(diào)用C接口來完成相應(yīng)的外設(shè)驅(qū)動接口。 我們知道
    的頭像 發(fā)表于 01-18 11:05 ?3267次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>與<b class='flag-5'>C</b>++相互<b class='flag-5'>調(diào)用</b>

    如何區(qū)分xenomai、linux系統(tǒng)調(diào)用/服務(wù)

    對于同一個POSIX接口應(yīng)用程序,可能既需要xenomai內(nèi)核提供服務(wù)(xenomai 系統(tǒng)調(diào)用),又需要調(diào)用linux內(nèi)核提供服務(wù)(linux
    的頭像 發(fā)表于 05-10 10:28 ?1985次閱讀

    C語言_Linux基本命令與C語言基礎(chǔ)

    這篇文章介紹在Linux環(huán)境下學(xué)習(xí)C語言搭建基本的環(huán)境過程,了解基礎(chǔ)的幾個命令使用方法,了解Linux
    的頭像 發(fā)表于 08-14 09:45 ?1115次閱讀

    C語言使用函數(shù)調(diào)用在內(nèi)存中究竟發(fā)生了什么?

    C語言使用函數(shù)調(diào)用,我們再熟悉不過了,但是函數(shù)調(diào)用在內(nèi)存中究竟發(fā)生了什么真的清楚嗎?只有搞清楚內(nèi)存里的內(nèi)幕,才算完全搞懂函數(shù)的
    的頭像 發(fā)表于 01-13 14:09 ?1082次閱讀

    深入探索Linux中的C語言

    本章將深入探索 Linux 中的 C 語言。在本章中,我們將學(xué)到更多關(guān)于編譯器、從源碼到二進(jìn)制程序的 4 個步驟、如何使用 Make 工具以及系統(tǒng)調(diào)用
    的頭像 發(fā)表于 03-14 16:48 ?1589次閱讀