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

    文章

    7574

    浏览量

    148207
  • Linux
    +关注

    关注

    87

    文章

    10943

    浏览量

    206546
  • System
    +关注

    关注

    0

    文章

    161

    浏览量

    36552
  • C语言
    +关注

    关注

    180

    文章

    7513

    浏览量

    124276
收藏 人收藏

    评论

    相关推荐

    怎么在C语言调用系统指令

    如果需要在C语言调用系统指令,经常使用system函数,操作简单方便,很容易理解。
    发表于 09-06 14:50 417次阅读

    C语言使用函数调用的知识点

    C语言使用函数调用,我们再熟悉不过了,但是函数调用在内存中究竟发生了什么真的清楚吗?只有搞清楚内存里的内幕,才算完全搞懂函数的调用
    发表于 09-07 11:47 656次阅读

    第三课: 了解C语言, C语言System函数与关机程序

    C语言编程语言
    电子学习
    发布于 :2023年01月14日 14:19:24

    [推荐]linux下的c语言编程简介

    基本的了解。第二章从本章开始,我们将进入Linux充满挑战的C语言编程世界,首先介绍的是文本编辑器。文本编辑器可以说是计算机最基本的应用,修改设置文 件、编写程序或者建立文件都需要用到
    发表于 04-29 13:50

    电房门控开关,真的了解吗?!

    电房门控开关,真的了解吗?!以上具体视频的链接地址: 免费的 ,http://pan.baidu.com/s/1o681lVk,不妨看看挺有用的
    发表于 04-12 12:26

    C 语言程序设计---必会的 Linux

    、链接、执行重要的 Linux对于 Linux,我是强烈建议大家必须的会,这个是一个硬性要求技术,说不会 Linux真的来公司,
    发表于 08-06 17:05

    请问为什么要在Linux下学习C语言

    接触到的都是肤浅的表面。C语言就那么几个语法吗?这一行语句写下去以后编译器到底干了什么?他到底做了哪些优化?变量在内存中到底是一种怎样的存在?编译器真的会按照
    发表于 06-24 14:25

    频率和时序,是否真的了解呢?

    影响内存的关键因素是哪些?频率和时序,是否真的了解呢?时序与频率有什么区别?哪个对内存性能影响大?
    发表于 06-18 07:15

    真的了解快充吗?

    手机快充,PD快充,125W超级快充……想必这些词或多或少都会听过吧。在电池材质没有取得新突破之前,不断提升的快充技术也是符合当下节奏更快的生活的最佳选择。但是真的了解快充吗?快充是不是只需要一个
    发表于 07-26 08:11

    嵌入式Linux了解

    ,但是要学习内核,首先要会用Linux,知道Linux是如何操作,继而才能了解Linux怎么
    发表于 11-05 09:05

    真的都懂C语言

    发展前景的技术。1.嵌入式开发作为新人,第一C语言,有很多人自认为自己C语言很厉害,但是实际上一个从事嵌入式开发的老人,至少需要3-5年
    发表于 12-21 08:23

    LinuxC语言编程入门教程

    编程风格等。u3000u3000Linux 作为一个优秀的操作系统,一项非常重要的功能就是支持系统调用尤其是支持C语言的系统调用功能十分的方
    发表于 09-22 06:56

    什么是系统调用?为什么要用系统调用?

    实际上,很多已经被我们习以为常的C语言标准函数,在Linux平台上的实现都是靠系统调用完成的,所以如果想对系统底层的原理作深入的了解,掌握各种系统
    的头像 发表于 06-01 08:44 1.5w次阅读
    什么是系统<b class='flag-5'>调用</b>?为什么要用系统<b class='flag-5'>调用</b>?

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

    system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命>令执行完后随即返回原调用的进程。
    发表于 05-05 15:00 2937次阅读

    linux c使用system调用shell脚本

    system的原理其实就是调用fork创建子进程去执行shell命令,然后返回最后一条shell命令的状态值。linux下man system可以看到返回值说明: 1.
    发表于 04-02 14:41 1148次阅读