Linux进程间的通信(一)exec函数族,getenv获取系统环境变量,system和popen的区别,文件和记录锁定通信

本文主要是介绍Linux进程间的通信(一)exec函数族,getenv获取系统环境变量,system和popen的区别,文件和记录锁定通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

几个系统关键api

exec函数族

getenv()

 system()

文件和记录锁定通信


在Linux/Unix系统中,进程间通信方式(Inter-Process Comunication)通常有如下若干中方式:

1、文件和记录锁定

2、管道

3、信号

4、system-V

5、POSIX信号量

6、套接字 socket

这些通信机制统称IPC,它们各有特色,各有适用的场合。

首先介绍

几个系统关键api
exec函数族

在进程中加载新的程序文件或脚本,覆盖原有代码重新运行
函数原型和如何调用如图所示

参考文献:       

Linux进程——exec族函数、exec族函数与fork函数的配合_exec函数 代替 fork-CSDN博客

这个函数网上的介绍有很多写的非常好的,就不过多赘述了

getenv()

首先介绍如何查看Linux系统环境变量

可输入env或者export查看,如图:

这是我的系统环境变量

 

获取系统环境变量函数

char *getenv(const char *name)
搜索 name 所指向的环境字符串,并返回相关的值给字符串。

包含在头文件#include <stdlib.h>

具体用法为:

p = getenv("USER")
printf("USER=%s\n", p);// 获取当前用户名
p = getenv("PWD")
printf("PWD=%s\n", p);//获取当前路径
p = getenv("PATH")
printf("PATH=%s\n", p);//获取PATH环境变量

 system()

函数原型:

#include <stdlib.h>

int system(const char *command);

用法:在system()中直接添加想要调用的命令如system("ls -l");直接执行即可

重点:

system和fopen的区别

system函数的大概原理:

mysytem.c

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int mysystem(char *cmd)
{char tmp_cmd[1024] = {0};strcpy(tmp_cmd, cmd);    //将命令拷贝到临时的字符数组中// 参数列表char *argv[100] = {0};int argc = 0;//函数原型://#include <string.h>//char *strtok(char *str, const char *delim)//str -- 要被分解成一组小字符串的字符串。//delim -- 包含分隔符的 C 字符串。//该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针char *p = strtok(tmp_cmd, " ");argv[argc++] = p;while (1){/* strtok函数中有两个指针第一次调用这个函数是在while循环体之外,字符串中匹匹配的"delim"在第一个字符串和第二个字符串之间数此时的返回值第一个指针指向已经分割的字符串,第二个函数内部的指针指向返回值的指针+1,所以循环内的函数的第一个参数要填NULL是为了保留函数指针此时所在的位置以便于继续执行 */p = strtok(NULL, " ");if (p == NULL){printf("参数解析完毕\n");break;}argv[argc++] = p;}// 检查参数是否切割完毕for (int i = 0; i < argc; i++){printf("%s\t", argv[i]);}printf("\n");// 创建一个子进程pid_t pid = fork();if (pid == 0) // 子进程{// 执行程序,路径视为环境变量//带p的一类exac函数,包括execlp、execvp、execvpe,如果参数file中包含'/',//则就将其视为路径名,否则就按 PATH环境变量,//在它所指定的各目录中搜寻可执行文件。if (execvp(argv[0], argv) < 0){perror("加载程序失败\n");return -1;}return 0; // 退出子进程}// 父进程 ,等待回收子进程的资源wait(NULL);return 1;
};int main()
{mysystem("ls -l");
}

可以看到,在Linux内核中,system和popen的实现原理差不多,都是先fork一个进程然后execv环境变量然后return,system和popen的区别在于popen需要搭配pclose使用,因为popen在执行完之后没有释放资源,需要手动去回收资源,要不然就会变成僵尸进程。 

参考文献:

Linux的system()和popen()差异_linux system 和 popen-CSDN博客

文件和记录锁定通信

一种非常古老原始的通信方式,在Linux中磁盘中创建一个文本文件,进程可以通过读写同一个文件来交换信息,已经给淘汰了,这里简单介绍一下

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
// 全局变量
char value[1024] = {0};int main()
{// 创建一个文件int fd = open("test.txt", O_RDWR | O_CREAT | O_EXCL, 0777);// 创建一个进程pid_t pid = fork();if (pid == 0) // 子进程获取数据{while (1){printf("子进程,请输入数据\n");scanf("%s", value);// 写入文件lseek(fd, 0, SEEK_SET);write(fd, value, strlen(value));}}if (pid > 0) // 父进程输出数据{while (1){// 读取文件lseek(fd, 0, SEEK_SET);read(fd, value, 1024);printf("输出数据%s\n", value);sleep(3);}}
}

 欲知后事如何,且听下回分解,下一篇,更精彩

这篇关于Linux进程间的通信(一)exec函数族,getenv获取系统环境变量,system和popen的区别,文件和记录锁定通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120352

相关文章

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代