关于进程间通信:C语言popen-函数调用其他进程返回值

前言当咱们想用C语言调用一个现有程序, 并且想获取程序返回值而不是在终端输入, 那么就必须调用popen( )函数了. popen( ) 会创立一个管道, 并启动新过程, 通过管道进行过程间通信。popen( ) 返回一个文件指针,相似fopen( ), 只不过关上的不是文件, 文件指针用来读取或写入子过程的输出/输入。 popen( ) 函数有两种模式:读模式r和写模式w。在读模式下,从子过程的输入中读取数据;在写模式下,将数据写入子过程的输出。 一、popen( ) 函数原型popen( )在规范库<stdio.h>中的函数原型: man文档 #include <stdio.h> FILE *popen(const char *command, const char *type); int pclose(FILE *stream);文件指针须要被回收, 用pclose( ) 函数. 二、应用示例 (AI提供)以下代码在Linux和Windows下都能够用, ls -l 是一个Linux命令, 用于显示指定工作目录下之内容(列出目前工作目录所含的文件及子目录)。 #include <stdio.h>int main(){ FILE *fp; char buffer[1024]; // 执行命令并读取输入 fp = popen("ls -l", "r"); if (fp == NULL) { printf("无奈执行命令\n"); return 1; } // 读取输入并打印 while (fgets(buffer, sizeof(buffer), fp) != NULL) { printf("%s", buffer); } // 敞开文件指针 pclose(fp); return 0;}总结我在一篇文章中, 应用了 popen( ) 函数调用 wmic cpu get 命令, 并将其输入传入程序, 判读电脑cpu属性. ...

September 11, 2023 · 1 min · jiezi

关于进程间通信:共享内存和消息传递的优缺点

过程间通信(InterProcess Communication,IPC) 低级过程通信:互斥和同步(替换的信息量较少且效率较低)高级过程通信, 共享存储器零碎(通过Kernel间接在物理空间上开拓的一块物理内存)管道通信零碎(能够浏览:https://www.usna.edu/Users/cs...)。管道其实就是一个文件,分为有名管道(个别的文件都有名字)和无名管道(为了解决过程之间拜访文件带来的烦扰[比方文件的权限],以及通过文件名检索文件也须要大量工夫,所以发明了无名管道)。但管道与一般的文件不同,1.由kernel进行治理管道的读写并发问题 2.通信过程中的数据不会被写入disk,而是缓存在内存中,从而提高效率。管道是半双工的,单向的,写方永远是写方,读方永远是读方。写过程会将缓冲区写满,读过程能力从缓冲区中读数据。消息传递零碎(间接通信:将信息交到对方手中,间接通信:借助Kernel将信息进行替换,如电子邮件)Shared Memory and Message passing 优缺点: 参考https://www.tutorialspoint.co... Shared Memory 长处 通信速度比拟快。因为*间接拜访内存,那么内存的访问速度是很快的、*不须要借助第三方的帮忙 毛病 实现比较复杂,并行率低。因为须要人为的去管制并发带来的问题。 Message passing 长处 与下面相同,实现简略,可能实现多个过程的并发。因为这种模式下只须要将信息传递给对方过程的音讯队列中即可。(其中一种就是借助kernel当做信使,传递到对方的队列中) 毛病 通信速率较低。正如下面所说,须要零碎调用来使kernel帮本人工作,以及kernel连贯音讯队列时都须要比拟多的工夫。所以速率较低。

August 4, 2021 · 1 min · jiezi