linux--进程--system与popen函数

news2025/2/27 5:41:17

1.system

#include <stdlib.h>
 
int system(const char *command);

返回值:

        成功,则返回进程的状态值;不能源码execl函数,返回127;失败返回-1;

        不能成功运行分析文章:linux下system函数详解_linux system_遥_望的博客-CSDN博客

在linux系统下,system函数是execl函数的封装版

popen()函数较于system()函数的优势在于使用简单,popen()函数只返回两个值:成功 /失败

源码:

#include
#include
#include
#include

int system(const char * cmdstring)
{
  pid_t pid;
  int status;

  if(cmdstring == NULL){
      
      return (1);
  }


  if((pid = fork())<0){

        status = -1;
  }
  else if(pid == 0){
    execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
    -exit(127); //子进程正常执行则不会执行此语句
    }
  else{
        while(waitpid(pid, &status, 0) < 0){
          if(errno != EINTER){
            status = -1;
            break;
          }
        }
    }
    return status;
}

在linux系统下,system函数是execl函数的封装版
文中的 "sh -c ps"和我们所使用的"ps"是完全等价的

例子代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
   system("ps");
   printf("\n");
}

直接运行ps指令;

运行文件:

#include <stdio.h>
int main(int argc,char *argv[])
{
  int i;
  for(i=0;i<argc;i++){
     printf("argv[%d]:%s\n",i,argv[i]);
  }
  return 0;
}

system运行:

#include <stdio.h>
#include <stdlib.h>
int main()
{
   system("./test aa bb cc dd");
   printf("\n");
} 

结果:

    argv[0]:./test  //程序地址
    argv[1]:aa //以下为程序参数
    argv[2]:bb
    argv[3]:cc
    argv[4]:dd

还可以运行子进程中的其他程序:

在Linux文件编程中

写一个TEST.config文件:

SPEED=5
LENG=1
SCORE=90
LEVEL=95

对TEST.config文件内容进行修改,将LENG=1,改成LENG=5

代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
 
int main(int argc,char **argv)
{
    int fdsrc;
    char *readbuf=NULL;
    
    if(argc!=2){
        printf("pararm error\n");
        exit(-1);//tuichugaichengxu
    }
    
    //打开文件,将文件复制到readbuf中
    fdsrc=open(argv[1],O_RDWR);
    int size=lseek(fdsrc,0,SEEK_END);
    lseek(fdsrc,0,SEEK_SET);
 
    readbuf=(char *)malloc(sizeof(char)*size+8);
    int n_read=read(fdsrc,readbuf,size);
 
    //找到readbuf中LENG=中的位置,将位置移动到1,替换为5
    char *p=strstr(readbuf,"LENG=");
    if(p==NULL){
        printf("not found\n");
        exit(-1);
    }
    
    p=p+strlen("LENG=");
    *p='5';
 
    //移动光标到文件头,重新将readbuf中的内容写入到打开的文件中
    lseek(fdsrc,0,SEEK_SET);
    int n_write=write(fdsrc,readbuf,strlen(readbuf));
 
 
    close(fdsrc);
    return 0;
}


编译:gcc demo13.c

运行:./a.out TEST.config

运行结果为:

SPEED=5
LENG=5
SCORE=90
LEVEL=95

system运用:

将上述代码编译为./changedata

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
	pid_t pid;
	int data=10;
 
	
	while(1){
		printf("please input a data\n");
		scanf("%d",&data);
		if(data==1){
			pid=fork();
			if(pid>0){
				wait(NULL);
			}
			if(pid==0){
//				execl("./changedata","changedata","config.txt",NULL);
				system("./changedata config.txt");
				exit(0);
			}
		}
		else{
			printf("wait,do nothing\n");	
		}
 
	}
 
 
	return 0;
}

cat config.txt

能够发现LENG=1变成了LENG=5

要注意的是,system运行完后,父进程还会继续向下运行,这点与execl函数不同。

2.popen函数

popen的使用:

#include <stdio.h>
 
FILE *popen(const chat *command, const char *type);
int pclose(FILE *stream);

 command:是一个指向以NULL结束的shell命令字符串的指针。

type:只能是读或写的其中一种r/w

无法获得system的值,需要使用popen
 

代码:

#include <stdio.h>


int main()
{
        char ret[500]={0};
        FILE *fp;
        fp = popen("ps","r");
        int n_read = fread(ret,1,1024,fp);
        printf("read ret = %d byte\n ret =\n %s\n",n_read,ret);



        return 0;
}

结果:

当使用system时,ret的值无法读出,用popen函数;

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

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

相关文章

Java网络编程(二)Socket 套接字(TCP和UDP),以及TCP的回显

Socket 套接字 我们软件工作者&#xff0c;着重编写的是应用层的代码&#xff0c;但是发送这个数据&#xff0c;我们就需要将应用层传输到传输层&#xff0c;也就意味着我们需要调用应用层的API&#xff0c;统称为 Socket API。 套接字的分类&#xff1a; 流套接字&#xff…

2023数学建模国赛B题完整论文来啦!(含一二问求解代码及三四问仿真模拟代码)

大家好呀&#xff0c;从昨天发布赛题一直到现在&#xff0c;总算完成了全国大学生数学建模竞赛B题完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 说实话团队通宵一直到现在做…

汇川PLC学习Day1:跑马灯程序编写

汇川PLC学习Day1&#xff1a;跑马灯程序编写 一、 软件安装 进入官网下载软件 二、 使用帮助 三、 新建工程与功能代码实现 CtrlN 寻找内带输出模块的CPU并设置好工程名字与保存路径&#xff0c;语言选择想熟悉的类型 工程建立后&#xff0c;PLC_PRG即为用户编写程序文件…

【疑难杂症】解决 git 文件夹不显示绿色图标和红色图标的问题

目录 一、问题描述 二、问题解决前提 【2.1】首先保证电脑本机上有TortoiseGit这个软件 【2.2】TortoiseGit下载官网 【2.3】根据自己电脑位数进行下载&#xff0c;这里下载的是64位 【2.4】下载好之后&#xff0c;一路next进行安装&#xff0c;配置自己的邮箱和用户名 …

uni-app:重置表单数据

效果 代码 <template><form><input type"text" v-model"inputValue" placeholder"请输入信息"/><input type"text" v-model"inputValue1" placeholder"请输入信息"/><input type&quo…

用Python登录账户

1 问题 如何利用python登录账户&#xff1f; 2 方法 账户和密码存放在文件夹中从文件夹中读取并比较密码密文验证三次后&#xff0c;如不成功则锁定用户 通过。。。。。。。。等证明提出的方法是有效的&#xff0c;能够解决开头提出的问题。 代码清单 1 import osimport getpas…

FGO:使用chaIdea获取抽卡数据(mitmproxy抓包)

需求描述 最近逛贴吧看到好多master贴出自己的抽卡概率截图&#xff0c;本非洲杂鱼master也对自己的脸黑程度产生了好奇&#xff08;曾经15单芭娜娜池子1五星&#xff0c;6单道满池子1五星&#xff0c;梅莉池子330抽1五星&#xff0c;最近的芭娜娜复刻又330抽1五星&#xff09…

流程图用什么软件做比较好?这几个实用软件了解下

流程图用什么软件做比较好&#xff1f;流程图的制作对于企业管理、项目管理、产品设计等领域都非常重要。制作流程图可以帮助我们更好地理解事物之间的关系和流程&#xff0c;从而规划和组织工作。因此&#xff0c;选择一个合适的流程图软件是非常必要的。下面就给大家介绍几种…

C++中使用R“()“标记符书写多行字符串

在C#中使用表示的字符串能够跨越数行。用于在C#中写JS或SQL代码比较方便。 string sqlInsert "INSERT INTO tb_param(protocol, slave, number, ptype, pid, name, format) VALUES(2, 24, 0, 1, 1, a04005, .3);INSERT INTO tb_param(protocol, slave, number, ptype, …

day52(补)

300.最长递增子序列 力扣题目链接(opens new window) 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2…

ZFS了解

存储数据的管理通常涉及两个方面:对一个或多个块存储设备(如硬盘驱动器和SD卡)进行物理卷管理&#xff0c;并将它们组织成操作系统所看到的逻辑块设备(通常涉及卷管理器、RAID控制器、阵列管理器或合适的设备驱动程序)&#xff0c;以及对存储在这些逻辑块设备(文件系统或其他数…

使用 System.exit() 来优雅地终止 Spring Boot 项目

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 使用 System.exit() 来优雅地终止 Spring Boot 项目 ⏱️ 创作时间&am…

智安网络|面临日益增长的安全威胁:云安全和零信任架构的重要性

随着云计算技术的快速发展和广泛应用&#xff0c;云安全和零信任架构变得愈发重要。在数字化时代&#xff0c;云计算技术得到了广泛的应用和推广。企业和组织借助云服务提供商的强大能力&#xff0c;实现了高效、灵活和可扩展的IT基础设施。然而&#xff0c;随着云环境的快速发…

java设计模式,简单工厂和抽象工厂有什么区别?

java设计模式&#xff0c;简单工厂和抽象工厂有什么区别&#xff1f; 简单工厂模式&#xff1a; 这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况&#xff08;这样工厂类才不用经常更改&#xff09;。 它由三种角色组成&#xf…

数据可视化:四大发明的现代转化引擎

在科技和工业的蓬勃发展中&#xff0c;中国的四大发明——造纸术、印刷术、火药和指南针&#xff0c;早已不再是古代创新的象征&#xff0c;而是催生了众多衍生行业的崭新可能性。其中&#xff0c;数据可视化技术正成为这些行业的一颗璀璨明珠&#xff0c;开启了全新的时代。 1…

OpenCV 02(色彩空间)

一、OpenCV的色彩空间 1.1 RGB和BGR 最常见的色彩空间就是RGB, 人眼也是基于RGB的色彩空间去分辨颜色的. OpenCV默认使用的是BGR. BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不同. 显示图片的时候需要注意适配图片的色彩空间和显示环境的色彩空间.比如传入的图片…

微服务模式:服务发现模式

由于微服务应用的动态性&#xff0c;很难调用具有固定 IP 地址的服务。这就是服务发现的概念出现的背景。服务发现有助于客户端了解服务实例的位置。在这种情况下&#xff0c;服务发现组件将充当服务注册表。 服务注册表是一个包含服务实例位置的集中式服务器/数据库。在微服务…

Camera 信号波形状态及同步方式

方式一&#xff1a;解串器发出同步信号 主平台连接解串器&#xff08;Deserializer&#xff09;再连接四个摄像头模组&#xff0c;每个摄像头模组包含 Sensor 串行器。解串器产生帧同步信号 &#xff08;FrameSync&#xff09;传递给串行器&#xff0c;再传递给 Sensor&#x…

嵌入式IDE(2):KEIL中SCF分散加载链接文件详解和实例分析

在上一篇文章IAR中ICF链接文件详解和实例分析中&#xff0c;我通过I.MX RT1170的SDK中的内存映射关系&#xff0c;分析了IAR中的ICF链接文件的语法。对于MCU编程所使用的IDE来说&#xff0c;IAR和Keil用得比较多&#xff0c;所以这一篇文章就来分析一下Keil的分散文件.scf(scat…

geopandas 笔记:geometry上的操作汇总

如无特殊说明&#xff0c;数据主要来自&#xff1a;GeoDataFrame 应用&#xff1a;公园分布映射至subzone_UQI-LIUWJ的博客-CSDN博客 0 读入数据 subzone gpd.read_file(ura-mp19-subzone-no-sea-pl.geojson) subzone subzone_tstsubzone[0:5] subzone_tst subzone_tst.plot…