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

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.mzph.cn/diannao/14548.shtml

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

相关文章

如何使用脚本执行SQL Server 数据库压缩备份?

SQL Server 数据库压缩备份是否可以实现&#xff1f; 使用时&#xff0c;SQL Server 数据库会变得非常大&#xff0c;备份也是如此。它们占用大量磁盘空间&#xff0c;并且每次备份数据库或四处移动都非常耗时。因此&#xff0c;您可能想知道是否有任何方法可以创建压缩备份。…

pikachu靶场(SQL注入基于布尔的盲注)python实现

import requests from bs4 import BeautifulSoupurl "http://localhost:8086/pikachu-master/vul/sqli/sqli_blind_b.php"def get_database_name(url):dataname # 初始化一个空字符串用于存储数据库名dict abcdefghijklmnopqrstuvwxyz # 数据库名可能存在这些…

docker实战之搭建MYSQL8.0主从同步

目录 环境配置容器创建主服务器创建MYSQL容器新增my.cnf文件创建用户并授权 从服务器创建MYSQL容器新增my.cnf文件重启MYSQL容器配置主从同步 验证主从同步彩蛋 MySQL 主从同步&#xff08;Master-Slave Replication&#xff09;是一种常用的解决方案&#xff0c;它允许一个主服…

LabVIEW与串口通讯在运行一段时间后出现数据接收中断的问题

这些问题可能与硬件、软件或通信协议有关。以下是详细的原因分析和可能的解决方案&#xff1a; 一、硬件原因 串口线缆或接口问题&#xff1a; 由于长时间使用&#xff0c;串口线缆可能出现接触不良或损坏。接口松动也可能导致通讯中断。 解决方案&#xff1a;检查并更换串口…

【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 的信息的方式不太一样&#…

Linux c开发线程锁和条件变量使用

#include <pthread.h> #include <stdio.h> #include <unistd.h>pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond PTHREAD_COND_INITIALIZER;void* thread_function(void* arg) {printf("线程等待唤醒,锁定互斥量...\n");…

windows平台vcpkg安装

1. 克隆vcpkg仓库 git clone https://github.com/microsoft/vcpkg 2.运行bootstrap-vcpkg.bat下载vcpkg.exe 3.运行验证 4.使用VCPKG安装OPENSSL 5.安装成功

VC++学习(1)——环境准备,参考文档等,初步入门VC++

目录 引出环境准备&#xff0c;参考文档第一讲 初步入门键盘按下的消息鼠标左键按下报错源码新建一个工程 总结 引出 VC学习&#xff08;1&#xff09;——环境准备&#xff0c;参考文档等&#xff0c;初步入门VC C是一门编程语言,他的语法标准和语言特性是全球统一的 VC是微…

计算机系统概述习题

选择题 电子计算机问世至今&#xff0c;新型计算机不断推陈出新&#xff0c;不管怎么更新&#xff0c;依然具有“存储程序”的特点&#xff0c;最早提出这种概念的是(B) A. 巴贝奇 B. 冯*诺伊曼 C. 帕斯卡 D. 贝尔 B下列描述中___是正确的。 A. 控制器能理解&#xff0c;解释…

中国主要城市房价指数数据集(2011-2024)

数据来源&#xff1a;东方财富网 时间跨度&#xff1a;2011年1月 - 2024年4月 数据范围&#xff1a;中国主要城市 包含指标&#xff1a; 日期、城市 新建商品住宅价格指数-同比 新建商品住宅价格指数-环比 新建商品住宅价格指数-定基 二手住宅价格指数-环比 二手住宅价格指…

Visual Studio 调试及快捷键

文章目录 原文连接环境一、调试器的基本使用1、更改执行流2、快速执行某一条代码断点设置条件断点查看内存信息查看调用堆栈查看寄存器信息设置监视断点调试二、快捷键一、窗口快捷键二、查找相关快捷键三、代码快捷键原文连接 【教程】visual studio debug 技巧总结 环境 一…

OpenCASCADE Draw模块TKDraw项目问题修改

1.问题 在调试Draw模块代码时&#xff0c;出现一个小问题&#xff0c;导致无法正常运行 如下&#xff1a; 2.代码跟踪 通过代码跟踪发现时一个数组越界问题&#xff0c;在此处添加了判断处理&#xff0c;程序可以正常调试

数据结构顺序表实现通讯录

目录 1. 前言&#xff1a; 2.通讯录项目的创建 3. 通讯录的实现 3.1 通讯录的初始化 3.2 通讯录的销毁 3.3 通讯录添加数据 3.4 通讯录查找数据 3.5 通讯录展示数据 3.6 通讯录删除数据 3.7 通讯录修改数据 4. 通讯录完整代码 4.1 test.c 4.2 SeqList.h 4.3 SeqLis…

数据结构(Java实现):ArrayList

目录 1.ArrayList简介2.ArrayList构造方法分析3.ArrayList的add方法以及扩容机制4.ArrayList常用方法5.ArrayList遍历6.ArrayList的缺陷 1.ArrayList简介 在集合框架中&#xff0c;ArrayList是一个普通的类&#xff0c;实现了List接口&#xff0c;具体框架图如下&#xff1a; …

编写一个llvm编译器插件,完成在store汇编指令前对内存合法性的check。

dds(iceoryx、fastdds等)中间件采用了共享内存&#xff0c;如果app内存越界将共享内存踩踏坏了&#xff0c;将会形成灾难。本插件可以检测到app是否在写共享内存&#xff0c;如果是&#xff0c;我们可以让app assert。从而提高dds的稳定性 插件效果&#xff1a; 插件源码&…

话题:如何让大模型变得更聪明?

随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;大模型&#xff08;如GPT-4、BERT、Transformer等&#xff09;在自然语言处理、图像识别和语音识别等领域取得了显著成果。然而&#xff0c;如何让大模型变得更聪明&#xff0c;进一步提升其性能和应用效果&a…

Jetbrain | IDEA的启动logo替换成可爱的vtuber-logo

看了这个&#xff0c;好可爱 【上Github热榜了&#xff01;当编程语言的Logo变得可爱起来~】 又看了这个 光速整活&#xff0c;强啊 看到很多人整IDEA的logo包括我自己&#xff0c;都不是特别方便的搞&#xff0c;我就直接把文件放在绑定资源里直接下吧 然后直接找到本体的安…

【深度学习】与【PyTorch实战】

目录 一、深度学习基础 1.1 神经网络简介 1.2 激活函数 1.3 损失函数 1.4 优化算法 二、PyTorch基础 2.1 PyTorch简介 2.2 张量操作 2.3 构建神经网络 2.4训练模型 2.5 模型评估 三、PyTorch实战 3.1 数据加载与预处理 3.2 模型定义与训练 3.3 模型评估与调优 3…

成都青年AI人才崭露头角,知了汇智科技助力孵化营大放异彩

5月18日-19日&#xff0c;为期两天的成都国际商贸城青年&#xff08;大学生&#xff09;AI应用孵化营活动在热烈的氛围中圆满落幕。本次活动由成都国际商贸城、成都成商数字科技有限公司、成都知了汇智科技有限公司及成都电商职教集团联合举办&#xff0c;旨在为青年&#xff0…

丢失api-ms-win-crt-runtime-l1-1-0.dll的多种解决方法分析,教你简单的一键修复

在使用Windows操作系统时&#xff0c;用户可能会遇到一个涉及丢失 ​api-ms-win-crt-runtime-l1-1-0.dll文件的警告&#xff0c;这可能导致某些程序无法正常运行。该DLL文件属于Microsoft Visual C Redistributable软件包的一部分&#xff0c;这个软件包为多个应用提供运行时支…