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

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

分辨率三兄弟LPI、DPI 和 PPI有什么区别? 搞清分辨率的那些事儿

《分辨率三兄弟LPI、DPI和PPI有什么区别?搞清分辨率的那些事儿》分辨率这个东西,真的是让人又爱又恨,为了搞清楚它,我可是翻阅了不少资料,最后发现“小7的背包”的解释最让我茅塞顿开,于是,我... 在谈到分辨率时,我们经常会遇到三个相似的缩写:PPI、DPI 和 LPI。虽然它们看起来差不多,但实际应用