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

    文章

    8486

    浏览量

    150805
  • Linux
    +关注

    关注

    87

    文章

    11219

    浏览量

    208872
  • System
    +关注

    关注

    0

    文章

    165

    浏览量

    36877
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136117
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

    真的都懂C语言

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

    LinuxC语言编程入门教程

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

    浅谈CC++ 和 ARM 汇编语言之间的调用

    之间的调用 本节提供一些示例,显示如何从C++调用C和汇编语言代码,以及从C和汇编
    发表于 10-19 09:24 2次下载

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

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

    知道Linux系统调用的原理

    系统调用是应用程序与操作系统内核之间的接口,它决定了程序如何与内核打交道的。无论程序是直接进行系统调用,还是通过运行库,最终还是会到达系统调用这个层面上
    发表于 05-16 16:21 1482次阅读
    <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 1274次阅读

    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 3276次阅读
    <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 2003次阅读

    C语言_Linux基本命令与C语言基础

    这篇文章介绍在Linux环境下学习C语言搭建基本的环境过程,了解基础的几个命令使用方法,了解Linux
    的头像 发表于 08-14 09:45 1122次阅读

    C语言使用函数调用在内存中究竟发生了什么?

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

    深入探索Linux中的C语言

    本章将深入探索 Linux 中的 C 语言。在本章中,我们将学到更多关于编译器、从源码到二进制程序的 4 个步骤、如何使用 Make 工具以及系统调用
    的头像 发表于 03-14 16:48 1670次阅读