popen和system函数的区别 以及 popen打开的FILE指针能否用close替代fclose关闭

C++笔记之popen()和std_system()和std_async()执行系统命令比较 函数在执行时会阻塞主线程,可能导致整个应用程序在执行外部命令时暂停。您可以在启动异步任务后执行其他任务,然后使用。这意味着异步任务的效果仅在执行系统调用期间是异步的,而在。您可以在启动异步任务后执行其他任务,然后使用。用于启动异步任务,但在此代码中,主线程仍然会等待异步任务完成,因为在。为实际的脚本路径和参数。或其他多线程库来在后台执行系统调用,以便主线程可以继续执行其他任务。这个命令将在一个新的子进程中运行,通常用于执行外部命令。策略,表示它应该在一个新的线程中异步执行。执行脚本,并在异步任务中调用它。 阅读详情

popen和system函数的区别

在c/cpp程序中执行shell命令,通常有两种方式,一种是使用popen函数,一种是使用system函数;两者会调用fork函数从父进程中fork出一个子进程,然后在子进程中执行shell命令,其主要的区别如下:

  • popen
    popen会先fork一个子进程,然后子进程去执行shell命令,函数同时返回一个FILE指针给调用者,调用者可以根据FILE指针来获取函数的执行结果。popen是非阻塞的,即执行后可立即返回。
  • system
    system会fork一个子进程,然后父进程等待子进程结束,也就是执行system函数是阻塞的,如果调用 system("sleep 1"),将会延迟1s再执行system后面的代码。

popen打开的FILE句柄能否用close替代fclose关闭?

急的话直接看答案就行:不行,会有一些副作用

实际中遇到的问题

最近遇到一个这样的问题:
场景:为了完成相关功能,需要在程序调用shell命令,用到了popen;为了支持多个命令并发,
在获取shell命令的结果时使用reactor模式(借助了epoll的多路复用能力,epoll监听对应的fd是否有事件过来),以提升处理效率。其伪代码大概如下:

//注册信号处理函数,防止产生僵死进程
signal(SIGCHLD, SIG_IGN);
//将popen打开的文件描述符加入epoll
FILE * file = popen("shell cmd", "r"); //这边shell cmd为具体的shell脚本
//将FILE转int,然后加入到epoll中
int fd = fileno(file);
//将描述符设置为非阻塞模式
set_no_block(fd);
struct epoll_event event;
event.events = EPOLLIN | EPOLL UT;
event.data = ...; //epoll保存的data
epoll_ctl(epfd, EPOLL_CTL_ADD, fd,&event);

在epoll主循环中,

int num = epoll_wait(timeout);
for(int i = 0; i < num; i++)
{
	//处理epoll事件
	processEvent(...)
}

其中processEvent的大体逻辑如下:

void processEvent(struct epoll_event* event)
{
	//事件处理,比如读取结果等

    //收尾工作,如删除epoll监听的fd,关闭文件描述符
    ...
    close(fd); //这边fd为第一部分添加尽量的描述符fd,可以从event中获取
}

功能开发完成后,自测ok,然后就放着让他跑,看看稳定性。这时程序的cpu使用率有时会飙升,外部程序调用该服务存在间断性的失败。这时用top或者ps看一下进程,会发现有时候出现多个此进程的子进程;且从失败的时间点看,周期和popen执行的周期基本能对上。由于子进程是fork出来的,popen内部调用了fork,就怀疑是popen带来的问题。
排查程序发现可能是使用close替代pclose来关闭用popen打开的描述符导致的问题,然后改了下代码后,发现该问题消失。

demo测试分析

为了对比使用close和fclose关闭popen打开的描述符的差别,这边进行了下面的实验,测试代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <iostream>
using namespace std;

int main()
{
        signal(SIGCHLD, SIG_IGN);
        while(1)
        {
        char szCommand[128] = {0};
        snprintf(szCommand, sizeof(szCommand) - 1, "cat testfile"); //这边testfile为一个文本文件
        FILE* fp = popen(szCommand, "r");
        if(NULL == fp)
        {
                std::cout << "popen failed" << endl;
        }
        usleep(1000);
        
        //1
        int fd = fileno(fp);
        close(fd);
        
        //2
        //fclose(fp);
        }
        return 0;

}

分别使用close和fclose,编译出两个testpopen文件,然后运行,过一阵后,使用close关闭的程序表现如下:
使用close关闭的效果

使用pclose关闭的效果如下:
使用pclose关闭的效果
通过对比,看出了差异,如果通过close来关闭popen打开的FILE描述符的话,有些负面的作用【cpu高了,且有部分内存泄露】。

查了下pclose和close的差异,pclose除了会关闭文件描述符之外,还具有pclose会调用waitpid为popen时fork的子进程收尸,而fclose不会;另外pclose还具有在关闭文件时冲刷缓冲区的功能。

【16】linux命令/工具,systemd,文件操作,动静态库,信号,socket apt install python3-pip --fix-missing(断开vpn,cp /etc/apt/sources.list /etc/apt/sources.list.bak,python3 -m pip install --upgrade pip,apt-get update,pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com)设置时间,联网,apt-get install vim。 阅读详情

相关推荐

XDcms旭东版多语言CMS深度解析与实战优化指南

CMS(内容管理系统)是企业官网建设的核心技术底座,其多语言支持能力直接决定全球化业务的落地效率。本文围绕轻量级PHP CMS——XDcms旭东版,深入剖析其基于UTF8字符集与数据库字段级语言隔离的多语言实现原理,揭示其区别于Laravel等现代框架的‘数据层+模板层双轨制’架构本质。该方案虽无Composer依赖或国际化抽象层,却以高可控性、低学习成本和强主机兼容性,在中小制造、外贸及教育类官网场景中持续发挥技术价值。文章覆盖从URL路径化改造、lang_code字段设计、模板回退机制到SEO href

weixin_29011993的博客 253

popen和system区别

popen和system都可以执行外部命令。 popen相当于是先创建一个管道,fork,关闭管道的一端,执行exec,返回一个标准的io文件指针。 system相当于是先后调用了fork, exec,waitpid来执行外部命令 popen本身是不阻塞的,要通过标准io的读取使它阻塞 system本身就是阻塞的。   最近写的程序,要求进程在调用的外部命令运行完毕

YUAN1125的专栏 2681

H3C IPsec over GRE VPN 实验

配置 IPsec over GRE VPN 来连通两端内网

M建的博客 2464

Linux的system和popen的差异

1. system()和popen()简介 在linux中我们可以通过system()来执行一个shell命令,popen()也是执行shell命令并且通过管道和shell命令进行通信。 system()、popen()给我们处理了fork、exec、waitpid等一系列的处理流程,让我们只需要关注最后的返回结果(函数的返回值)即可。 2. system()、popen()源码 首先我们来看一下这两个函数在源码(伪代码)上面的差异。 int system(const char *command

轮子工厂 2005

树莓派4B网线直连Windows全流程:从IP查询到SSH登录避坑指南

本文提供了一份详细的树莓派4B通过网线直连Windows电脑的实战指南。核心步骤包括配置Windows网络共享、查询树莓派IP地址以及通过SSH进行安全登录与初始配置。文章深入解析了直连的网络原理,并重点分享了使用CMD命令和工具定位IP、避免常见错误的避坑技巧,帮助用户在没有显示器或路由器的环境下快速完成树莓派初始化。

grape的博客 1080

大厂校招:星宸科技嵌入式面试及参考答案(5万字长文)

当一个新的硬件设备被插入系统时,内核会发送一个设备事件通知 udev,udev 会根据设备的属性和规则,为该设备创建一个合适的设备文件。通过去除不必要的驱动程序、禁用不需要的功能、选择合适的内核配置选项、优化内核编译选项和定制内核模块等方法,可以减小内核的大小和复杂性,提高系统的性能和稳定性。上半部通常是在中断关闭的情况下执行的,以确保中断处理的原子性。处理碎片化内存是内存管理中的一个重要问题,可以采用内存压缩、内存池管理、伙伴系统、首次适应算法和最佳适应算法等方法来减少内存碎片的产生,提高内存的利用率。

大模型大数据攻城狮的专栏 2927

popen和system的区别

1、system() 串行执行,程序会阻塞到system执行完成。 2、popen() 并行执行,可以在程序中读取命令的标准输出,也可在程序中写入命令的标准输入。

蓬莱道人的博客 4299

基于Simulink的压缩空气储能(Compressed Air Energy Storage, CAES)

压缩空气储能(CAES)是一种将电能转化为压缩空气存储在高压容器中,然后在需要时释放空气驱动涡轮机发电的技术。它具有大规模、长寿命和环境友好的特点,在电力系统中用于削峰填谷、频率调节和备用电源等应用。本项目将详细介绍如何在MATLAB/Simulink中搭建一个完整的基于压缩空气储能的系统,并提供具体的代码实现和设计步骤。如果你需要实现更复杂的控制逻辑,可以使用MATLAB Function模块。以下是一个简单的例子,展示了如何在该模块中实现一个条件逻辑:Matlab深色版本Kp = 1;

MHD0815的博客 1274

PHP命令执行与代码执行函数安全指南:从原理到防御实战

在Web开发中,命令执行与代码执行是PHP等语言提供的强大功能,允许程序与操作系统或动态执行代码进行交互。其核心原理是通过调用系统Shell或解释器来扩展应用能力,实现文件操作、进程管理等底层功能。然而,这种能力也带来了严重的安全风险,尤其是Shell注入和代码注入漏洞,攻击者可通过构造恶意输入执行任意命令或代码,导致服务器被完全控制。从技术价值看,理解这些函数的机制是构建安全应用的基石,能帮助开发者在灵活性与安全性间取得平衡。常见应用场景包括系统管理脚本、插件化架构、模板引擎和CI/CD流水线等。本文聚焦

weixin_34205826的博客 359

ESP32设备驱动-MLX90393磁场传感器驱动

MLX90393 磁场传感器可以在运行时重新编程为不同的模式和不同的设置。 该传感器使用 Melexis 专有的 Triaxis® 技术提供与沿 XYZ 轴感应的磁通密度成比例的 16 位输出,还提供温度输出信号。 这些数字值可通过 I2C 和 SPI 获得,其中 MLX90393 是总线上的从设备。

视觉与物联智能 2350

YOLO-V8训练自己的数据集之标注样本

四、标注样本 4.1、标注样本概述 4.1.1、样本标注主要方法 4.1.2、标注样本概念 4.1.3、标注样本实现方式 4.1.4、常见标注样本软件 4.2、标注工具LabelImg 4.2.1、LabelImg介绍 4.2.2、LabelImg特点 4.2.3、LabelImg安装方法 4.2.4、LabelImg使用方法 4.3、标注样本实操 4.3.1、安装标注软件Labelimg 4.3.2、Labelimg界面介绍 4.3.3、LabelImg实操过程中常

qq_29633789的博客 662

WebShell源码逆向分析:从攻击技术到防御实战的深度解析

在Web安全领域,理解攻击原理是构建有效防御体系的基础。动态代码执行、文件系统操作和网络通信是Web应用的核心技术,其安全实现直接关系到服务器的稳固性。通过分析攻击者常用的技术手段,如代码混淆、权限维持和流量伪装,可以深刻揭示系统潜在的风险点。这些技术原理不仅有助于识别恶意行为,也为开发安全的自动化运维工具和应急响应系统提供了借鉴。本文以典型的PHP WebShell为样本,深入拆解其模块化设计、隐蔽性实现和绕过防御的技巧,旨在从攻击视角反推防御策略,提升对Web后门的检测与处置能力。

weixin_33853794的博客 337

vscode配置matlab工作环境

前面有两篇文章我们分别讲了在vscode里面如何配置C语言环境和python环境,那两篇文章总体来说比较复杂,当然这篇也有许多有趣的问题。 附上链接: 文章目录matlab简介基本要求code runner插件与matlab相关的插件添加路径小结code runner是否支持更多语言更多选择另一个选择 matlab简介 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 MATLAB是ma

Cachel Wood的博客 4540

Ubuntu 18.04下PHP+MySQL BLOB存图实战指南

BLOB(Binary Large Object)是关系型数据库中存储二进制数据的基础机制,其核心原理在于将非结构化内容以字节流形式嵌入表记录,依托事务保障与行级锁实现强一致性。该技术在政务、金融等强审计场景中具备不可替代的数据原子性价值,但会显著放大I/O压力与备份开销。典型应用包括电子签名、证件照绑定、单据附件等需与主业务记录严格生命周期同步的轻量级图片(<100KB)。本文聚焦真实生产约束——Ubuntu 18.04系统EOL背景下,基于PHP 7.2与MySQL 5.7的BLOB图片存储全链路实践,

weixin_34234829的博客 370

Onnxruntime之YOLOP部署过程记录

魔改YoloP部署过程记录

如果想成为中心,那么就到中心去吧。 1924

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Ubuntu 18.04下PHP+MySQL BLOB安全存图实战指南

BLOB(Binary Large Object)是关系型数据库中存储二进制数据的基础机制,其核心原理是将原始字节流直接嵌入数据行,绕过文件系统抽象层,从而保障ACID事务一致性与备份原子性。在受限基础设施场景中,BLOB的技术价值凸显为‘上传即可见、删除即干净、备份即完整’的强一致性资产托管能力,尤其适用于政企内网、教育平台等无法接入对象存储或CDN的Ubuntu 18.04老旧环境。典型应用场景包括医保报销凭证、教务系统截图、CMS缩略图等中小规模(<10万张)、单图<8MB、以ID查询为主的图像服务。

weixin_34216107的博客 419

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【计算机网络】套接字编程(套接字API/UDP和TCP服务器/网络相关指令)

本文介绍了网络编程中的端口号、TCP/UDP协议、网络字节序及套接字编程等内容。端口号用于标识进程,TCP是面向连接的可靠协议,UDP是无连接的快速协议。套接字编程涉及创建socket、填充sockaddr结构、绑定socket等步骤,并详细说明了UDP和TCP专用的API函数。此外,文章还介绍了netstat和telnet指令的使用方法,以及回环地址的特殊性。最后,通过示例代码展示了如何实现UDP和TCP服务器与客户端的功能。

wefg1的博客 683

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

php内核源码解析=安全机制——PHP的安全防线底层

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <button id

qq_37805832的博客 895

Linux系统编程之进程(system函数、popen函数)

system() 函数是一个C标准库函数,用于执行系统命令或外部程序。它允许你从C程序中调用命令行命令。NAMEcommand 是一个以空终止的C字符串,包含要执行的命令。system() 函数的工作方式如下:它启动一个新的shell进程(通常是默认的命令行shell)。然后在新的shell中执行command字符串中指定的命令。当命令执行完毕后,system() 函数等待命令的返回状态(退出状态)。最后,它返回命令的返回状态。// 在Unix/Linux系统上列出当前目录的文件。

咖喱年糕的博客 4929

linux中 popen 和 system 区别和联系

(SAW:Game Over!)

布袋和尚 1007

Linux-popen,system函数差异

popen在linux下,不懂得可以查看帮助手册,我们先看看man手册怎么说。 可以看到,手册给出了两个函数原型,popen与pclose,其实我们很容易就能联想到另外一组函数,fopen,fclose。这两个函数是用来打开关闭文件的。所以其实我们已经可以猜到popen,pclose这两个函数的作用是什么了,p在linux下我们见到的地方大多数都与“管道”与关,所以可想而知,这两个函数实现的功

mxrrr_sunshine的博客 767

popen 与system函数笔记

文章大部分为摘抄,有些没有标明出处,请谅解。 通过popen查看selinux是否打开: #include #include int main () { char cmd[64] = {0}; char buf[64] = {0}; FILE *fd; sprintf(cmd,"getenforce\n"); fd = popen(cmd, "r"

chenpuo的博客 1223

linux popen()与system()的区别

linux popen()与system()的区别 popen() 可以在调用程序和POSIX shell /usr/bin/sh 要执行的命令之间创建一个管道(请参阅sh-posix(1) )。 popen() 的参数是指向以空字符结尾的字符串的指针,这些字符串分别包含一个shell 命令行和一个I/O 模式,此 模式可以是进行读取的r ,或进行写入的w 。 popen() 可返回一个流指针,...

weixin_33695450的博客 614

对于linux下system()函数的深度理解(整理)

这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为是其他的代码影响到这个,或是内核驱动文件系统什么的异常导致,昨天有出现了这个问题,就随手百了一下度,问题出现了,很多人都说system()函数要慎用要少用要能不用则不用,system()函数不

未冬生 1413
上一篇: Kubernetes
下一篇: 推荐一本书《go高级编程》
LinuxG_G
博客等级 码龄15年 58粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值