色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【Linux+C語言】你真的了解system接口的調用嗎?

嵌入式物聯網開發 ? 來源:嵌入式物聯網開發 ? 作者:嵌入式物聯網開發 ? 2022-09-12 16:33 ? 次閱讀

?本期給大家介紹了一下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語言調用系統指令,經常使用system函數,操作簡單方便,很容易理解。
    發表于 09-06 14:50 ?548次閱讀

    C語言使用函數調用的知識點

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

    請問為什么要在Linux下學習C語言?

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

    真的都懂C語言

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

    LinuxC語言編程入門教程

    編程風格等。u3000u3000Linux 作為一個優秀的操作系統,一項非常重要的功能就是支持系統調用尤其是支持C語言的系統調用功能十分的方
    發表于 09-22 06:56

    淺談C、C++ 和 ARM 匯編語言之間的調用

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

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

    system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字符串所代表的命令,此命>令執行完后隨即返回原
    發表于 05-05 15:00 ?3216次閱讀

    知道Linux系統調用的原理

    系統調用是應用程序與操作系統內核之間的接口,它決定了程序如何與內核打交道的。無論程序是直接進行系統調用,還是通過運行庫,最終還是會到達系統調用這個層面上
    發表于 05-16 16:21 ?1496次閱讀
    <b class='flag-5'>你</b>知道<b class='flag-5'>Linux</b>系統<b class='flag-5'>調用</b>的原理

    linux c使用system調用shell腳本

    system的原理其實就是調用fork創建子進程去執行shell命令,然后返回最后一條shell命令的狀態值。linux下man system可以看到返回值說明:?1.
    發表于 04-02 14:41 ?1280次閱讀

    LinuxC語言編程入門教程詳細說明

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

    C語言C++相互調用

    接口的問題,比如最常用的C++調用C接口來完成相應的外設驅動接口。 我們知道
    的頭像 發表于 01-18 11:05 ?3329次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>與<b class='flag-5'>C</b>++相互<b class='flag-5'>調用</b>

    如何區分xenomai、linux系統調用/服務

    對于同一個POSIX接口應用程序,可能既需要xenomai內核提供服務(xenomai 系統調用),又需要調用linux內核提供服務(linux
    的頭像 發表于 05-10 10:28 ?2059次閱讀

    C語言_Linux基本命令與C語言基礎

    這篇文章介紹在Linux環境下學習C語言搭建基本的環境過程,了解基礎的幾個命令使用方法,了解Linux
    的頭像 發表于 08-14 09:45 ?1145次閱讀

    C語言使用函數調用在內存中究竟發生了什么?

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

    深入探索Linux中的C語言

    本章將深入探索 Linux 中的 C 語言。在本章中,我們將學到更多關于編譯器、從源碼到二進制程序的 4 個步驟、如何使用 Make 工具以及系統調用
    的頭像 發表于 03-14 16:48 ?1882次閱讀
    主站蜘蛛池模板: 甜性涩爱快播| 国精品产露脸偷拍视频| 日本人六九视频| WWWXXXX兽交| 人人插人人射| 帝王受PLAY龙椅高肉NP| 少妇内射视频播放舔大片| 国产精品99亚发布| 性高跟鞋xxxxhd| 国内精品视频一区二区在线观看 | 久久精品国产只有精品| 亚洲综合国产精品| 极品虎白在线观看| 浴室里强摁做开腿呻吟的漫画| 久久久91精品国产一区二区 | 24小时日本在线观看片| 噜噜噜狠狠夜夜躁| 99在线观看免费视频| 日本高清免费看| 国产AV无码一二三区视频| 武侠古典久久亚洲精品| 黑人寄宿羽月希产后奶水| 樱花草在线观看影院| 免费看片A级毛片免费看| 菠萝菠萝蜜免费播放高清| 色99久久久久高潮综合影院| 国产欧美一区二区三区久久 | 成人国产一区| 忘忧草在线影院www日本| 国语自产一区第二页| 姉调无修版ova国语版| 欧美一级情欲片在线| 国产成人8x视频一区二区| 亚洲国产在线99视频| 久久亚洲精品2017| lesbabes性欧美| 天堂岛www天堂资源在线| 精品国产99久久久久久麻豆| 607080老太太AW| 涩涩爱涩涩电影网站| 黄色亚洲片|