Linux进程--函数 system 和 popen 的区别

news2024/12/23 13:16:42

system()popen() 是 C 语言中用于执行外部命令的两个函数,它们的功能类似,但在使用方式和特性上有一些区别。

system()

system() 函数允许您在程序中执行外部命令,并等待该命令执行完成后继续执行程序。其基本语法如下:

int system(const char *command);
  • command 是一个字符串,包含您要执行的命令。这可以是任何有效的命令,就像您在命令行中输入的一样。

  • system() 函数将返回执行结果。如果成功执行了命令,则返回值为命令的退出状态码。如果无法执行命令,则返回 -1。

  • system() 函数会阻塞当前进程,直到执行的命令完成。

示例:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int status = system("ls -l");
    if (status == -1) {
        printf("Failed to execute command\n");
    } else {
        printf("Command executed successfully with exit status: %d\n", status);
    }
    return 0;
}

 执行结果:

popen()

popen() 函数允许您在程序中执行外部命令,并建立一个到该命令的管道,可以通过管道进行输入和输出。其基本语法如下:

  • commandmode 参数分别与 system() 函数的参数相同,用于指定要执行的命令和管道的打开模式。

  • popen() 函数返回一个指向 FILE 结构的指针,您可以使用该指针来读取或写入命令的输入和输出。

  • popen() 函数允许并发执行多个命令,并且可以通过管道进行通信。

示例:

#include <stdio.h>

int main() {
    FILE *fp;
    char buffer[1024];

    fp = popen("ls -l", "r");
    if (fp == NULL) {
        printf("Failed to execute command\n");
        return 1;
    }

    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("%s", buffer);
    }

    pclose(fp);
    return 0;
}

执行结果:

这段代码的作用是执行一个外部命令 ls -l(列出当前目录下的文件和文件夹,并显示详细信息),并将命令的输出逐行打印到标准输出(终端)上。

让我们逐行解释代码:

  1. #include <stdio.h>:包含了标准输入输出的头文件。

  2. int main():主函数的定义。

  3. FILE *fp;:声明了一个指向 FILE 结构的指针 fp,它将被用作 popen() 返回的管道。

  4. char buffer[1024];:声明了一个用于存储命令输出的缓冲区。

  5. fp = popen("ls -l", "r");:调用 popen() 函数执行外部命令 ls -l,并将其输出连接到管道上。模式 "r" 表示只读模式,因此 fp 将用于从管道读取命令的输出。

  6. if (fp == NULL):检查 popen() 函数的返回值,如果返回空指针,则表示执行命令失败。

  7. printf("Failed to execute command\n");:打印错误信息。

  8. return 1;:退出程序,返回错误代码。

  9. while (fgets(buffer, sizeof(buffer), fp) != NULL):使用 fgets() 函数从管道中读取命令的输出,并将其逐行存储到 buffer 缓冲区中。循环会继续,直到 fgets() 函数返回 NULL,表示已经读取完全部输出。

  10. printf("%s", buffer);:打印缓冲区中的内容,即命令的输出。

  11. pclose(fp);:关闭由 popen() 打开的管道,并等待命令执行完毕。

  12. return 0;:退出程序,返回成功代码。

system 和 popen的区别:

  1. 返回类型

    • system() 返回命令的退出状态码。
    • popen() 返回一个文件指针,用于读取或写入命令的输入和输出。
  2. 阻塞特性

    • system() 函数会阻塞当前进程,直到执行的命令完成。
    • popen() 函数允许并发执行多个命令,并且您可以在不等待命令完成的情况下继续执行程序。
  3. 输入输出

    • system() 函数只能捕获命令的退出状态码,无法直接获取命令的输入和输出。
    • popen() 函数可以通过管道进行输入和输出,允许更灵活的交互。

综上所述,如果您只需要执行简单的命令并等待其完成,可以使用 system() 函数。如果您需要与命令进行交互,或者需要同时执行多个命令,可以使用 popen() 函数。

问:是不是虽然没有ls -l的运行结果没在终端显示,但是它已经执行了?

        是的,即使没有使用 printf 或其他输出函数将 popen() 命令的输出显示在终端上,该命令仍然会在后台执行,并将结果写入到管道中。

        即便没有读取管道中的输出,popen() 也会执行给定的命令,并等待命令执行完成。只是程序没有处理这些输出而已。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1688785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地idea连接虚拟机linux中的docker进行打包镜像上传--maven的dockerfile-maven-plugin插件

项目名必须是英文,-,.,_,这些数字,idea需要管理员运行,因为idea控制台mvn命令需要管理员权限才能运行(maven需配置环境变量)改linux中的Docker服务文件,使用2375 进行非加密通信,然后加载重启 2.1 #修改Docker服务文件 vi /lib/systemd/system/docker.service ​ # 通常使…

深度学习基于Tensorflow卷积神经网络VGG16的CT影像识别分类

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着医疗技术的快速发展&#xff0c;CT&#xff08;Computed Tomography&#xff09;影像已成为医生…

练习题(2024/5/22)

1N 皇后 II n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;2 解释&#xff1a;如上…

WAF绕过(下)

过流量检测 这里的流量检测就是在网络层的waf拦截到我们向webshell传输的数据包&#xff0c;以及webshell返回的数据 包&#xff0c;检测其中是否包含敏感信息的一种检测方式。如果是大马的情况下&#xff0c;可以在大马中添加多处判断代码&#xff0c;因此在执行大马提供的功…

设计模式12——外观模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 外观模式&#xff08;Facade&a…

【Linux】高效文本处理命令

目录 一.sort命令&#xff08;排序&#xff09; 1.语法格式 2.常用选项 3.相关示例 3.1. 3.2. 二.unip命令&#xff08;去重&#xff09; 1.语法格式 2.常用选项 3.相关示例 3.1. 3.2. 三.tr命令&#xff08;替换&#xff09; 1.语法格式 2.常用选项 3.相关示例…

如何在 Ubuntu 24.04 (桌面版) 上配置静态IP地址 ?

如果你想在你的 Ubuntu 24.04 桌面有一个持久的 IP 地址&#xff0c;那么你必须配置一个静态 IP 地址。当我们安装 Ubuntu 时&#xff0c;默认情况下 DHCP 是启用的&#xff0c;如果网络上可用&#xff0c;它会尝试从 DHCP 服务器获取 IP 地址。 在本文中&#xff0c;我们将向…

MySQL主从复制(二):高可用

正常情况下&#xff0c; 只要主库执行更新生成的所有binlog&#xff0c; 都可以传到备库并被正确地执行&#xff0c; 备库就能达到跟主库一致的状态&#xff0c; 这就是最终一致性。 但是&#xff0c; MySQL要提供高可用能力&#xff0c; 只有最终一致性是不够的。 双M结构的…

2024年甘肃特岗教师招聘报名流程,速速查收哦!

2024年甘肃特岗教师招聘报名流程&#xff0c;速速查收哦&#xff01;

WXML模板语法-事件绑定

一、 1.事件 事件是渲染层到逻辑层的通讯方式&#xff0c;通过事件可以将用户在渲染层产生的行为&#xff0c;反馈到逻辑层进行业务的处理 2.小程序中常用的事件 3.事件对象的属性列表 当事件回调触发的时候&#xff0c;会收到一个事件对象event&#xff0c;其属性为&#x…

Mysql之基本架构

1.Mysql简介 mysql是一种关系型数据库&#xff0c;由表结构来存储数据与数据之间的关系&#xff0c;同时为sql(结构化查询语句)来进行数据操作。 sql语句进行操作又分为几个重要的操作类型 DQL: Data Query Language 数据查询语句 DML: Data Manipulation Language 添加、删…

axios案例应用

1、Spring概述 Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架&#xff0c;以 IoC(Inverse Of Control: 反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核&#xff0c;提供了展现层 Spring MVC 和持久层。Spring JDBC 以及业务层事务管理等众多…

C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

C进阶&#xff1a;C11(列表初始化、右值引用与移动构造移动赋值、可变参数模版…Args、lambda表达式、function包装器) 今天接着进行语法方面知识点的讲解 文章目录 1.统一的列表初始化1.1&#xff5b;&#xff5d;初始化1.2 initializer_listpair的补充 2.声明相关关键字2.1a…

STM32——DAC篇(基于f103)

技术笔记&#xff01; 一、DAC简介&#xff08;了解&#xff09; 1.1 DAC概念 传感器信号采集改变电信号&#xff0c;通过ADC转换成单片机可以处理的数字信号&#xff0c;处理后&#xff0c;通过DAC转换成电信号&#xff0c;进而实现对系统的控制。 1.2 DAC的特性参数 1.3…

amis-editor 低代码可视化编辑器开发 和 使用说明

1.amis-editor可视化编辑器 React版本&#xff08;推荐&#xff09;&#xff1a; GitHub - aisuda/amis-editor-demo: amis 可视化编辑器示例 https://aisuda.github.io/amis-editor-demo 建议使用react版本&#xff0c;好维护&#xff0c;升级版本更新package.json中对应版本…

Property xxx does not exist on type ‘Window typeof globalThis‘ 解决方法

问题现象 出现以上typescript警告&#xff0c;是因为代码使用了window的非标准属性&#xff0c;即原生 window 对象上不存在该属性。 解决办法 在项目 根目录 或者 src目录 下新建 xxx.d.ts 文件&#xff0c;然后进行对该 属性 进行声明即可。 注意&#xff1a;假如xxx.d.ts文…

【vue】封装的天气展示卡片,在线获取天气信息

源码 <template><div class"sen_weather_wrapper"><div class"sen_top_box"><div class"sen_left_box"><div class"sen_top"><div class"sen_city">山东</div><qctc-time cl…

【Text2SQL 经典模型】X-SQL

论文&#xff1a;X-SQL: reinforce schema representation with context ⭐⭐⭐⭐ Microsoft, arXiv:1908.08113 X-SQL 与 SQLova 类似&#xff0c;使用 BERT style 的 PLM 来获得 representation&#xff0c;只是融合 NL question 和 table schema 的信息的方式不太一样&#…

Keil MDK map文件学习笔记

Keil MDK map文件学习笔记 map文件组成1.Section Cross References段交叉引用2.Removing Unused input sections from the image移除无用的段3.Image Symbol Table镜像符号表局部符号表全局符号表 4.Memory Map of the image镜像存储器映射ROM区执行域RAM区执行域 5. Image com…

C#学习指南:重要内容与实用技巧

学习C#编程是一段充满挑战但又非常充实的旅程。以下是我在学习过程中积累的一些经验&#xff0c;希望能对大家有所帮助。 一、掌握基础概念 类及其成员 C#中的类是编程的基础模块。理解类的结构、属性、方法和构造函数是至关重要的。每个类都有其特定的功能&#xff0c;学会如…