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;它允许一个主服…

Golang实现根据文件后缀删除文件和递归删除文件

概述 这个功能会非常强大&#xff0c;因为在日常工作中&#xff0c;我通常会遇到需要批量删除文件的场景&#xff0c;通过这个方法&#xff0c;再结合我的另一个 命令行开发框架&#xff0c;能够很轻松的开发出这个功能。 代码 package zdpgo_fileimport ("errors"…

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

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

C语言基础-内存申请和释放

在C语言中&#xff0c;malloc 和 free 是用于动态内存分配和释放的函数。而在C中&#xff0c;new 和 delete 提供了类似的功能&#xff0c;但它们之间有一些重要的区别。 1. malloc 和 free malloc malloc 函数用于在堆上动态地分配指定字节数的内存。它的原型在 stdlib.h 头…

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

一种获取java代码结构的实现思路

一种获取java代码结构的实现思路 有时,我们需要获取java文件里的代码结构,即,只需要里面的class定义、方法声明、属性定义。不需要额外的方法实现 这里提供一下实现思路: 采用语法解析器Tree-sitter对java代码进行解析,获取里面的方法实现遍历第一步获取到的方法列表,在源…

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");…

代码随想录算法训练营第十七天 | 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和

[LeetCode] 110. 平衡二叉树 [LeetCode] 110. 平衡二叉树 文章解释 [LeetCode] 110. 平衡二叉树 视频解释 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输…

HTTP 响应分割漏洞

HTTP 响应分割漏洞 1.漏洞概述2.漏洞案例 1.漏洞概述 HTTP 响应拆分发生在以下情况&#xff1a; 数据通过不受信任的来源&#xff08;最常见的是 HTTP 请求&#xff09;进入 Web 应用程序。该数据包含在发送给 Web 用户的 HTTP 响应标头中&#xff0c;且未经过恶意字符验证。…

CSS常用的两种定位方式

在CSS中&#xff0c;absolute 和 relative 是两种常用的定位方式&#xff0c;分别通过 position 属性进行设置。它们用于控制元素在页面中的位置。理解这两种定位方式对于布局和设计响应式页面非常重要。 position: relative 定义 relative 定位是相对自身原始位置进行偏移。…

Python 魂斗罗的音效和动漫效果

一、实现游戏音效 音效是游戏中不可或缺的一部分&#xff0c;它可以为游戏增添氛围和趣味性。在 Pygame 中&#xff0c;我们可以使用 pygame.mixer 模块来播放音效。下面是一个简单的示例代码&#xff0c;演示如何在游戏中播放音效&#xff1a; import pygamepygame.mixer.init…

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;程序可以正常调试

Golang使用HTTP框架zdpgo_resty实现文件下载

核心代码 代码解析&#xff1a; client.SetOutputDirectory("Downloads") 设置下载目录client.R().SetOutput("test.go").Get("http://127.0.0.1:3333/download 指定下载文件名并进行下载 // 设置输出目录路径&#xff0c;如果目录不存在&#xff…