Unix中的进程和线程-2

1.进程对环境变量的操作

在Linux中,你可以使用以下几个函数来操作环境变量:

  • getenv: 获取环境变量值。
  • setenv: 设置或修改环境变量值。
  • unsetenv: 删除环境变量
  • getenv:

    • 参数:接受一个字符串作为参数,表示要获取的环境变量的名称。
    • 用法:调用 getenv 函数时,传入要获取的环境变量的名称,函数返回对应环境变量的值的字符串指针。如果环境变量不存在,则返回 NULL。
  • setenv:

    • 参数:
      • 第一个参数是要设置或修改的环境变量的名称。
      • 第二个参数是要设置的环境变量的值,是一个字符串。
      • 第三个参数是一个整数,表示是否覆盖已存在的同名环境变量的值。
        • 如果第三个参数为 0,则不覆盖已存在的同名环境变量。
        • 如果第三个参数为非零值,则覆盖已存在的同名环境变量。
    • 用法:调用 setenv 函数时,传入要设置或修改的环境变量的名称、要设置的环境变量的值以及是否覆盖已存在的同名环境变量的值的选项。如果设置或修改成功,则返回 0;否则返回 -1,并设置 errno。
  • unsetenv:

    • 参数:接受一个字符串作为参数,表示要删除的环境变量的名称。
    • 用法:调用 unsetenv 函数时,传入要删除的环境变量的名称,函数会删除该环境变量。如果成功删除,则返回 0;否则返回 -1,并设置 errno。
#include <stdio.h>
#include <stdlib.h>
int main(void) {// 利用getenv获取环境变量char* path = getenv("PATH");printf("Original PATH: %s\n", path);// 利用setenv设置环境变量setenv("TEST_ENV", "123456", 1);printf("TEST_ENV: %s\n", getenv("TEST_ENV"));// 修改现有的环境变量setenv("PATH", "/usr/local/bin", 1);printf("New PATH: %s\n", getenv("PATH"));// 利用unsetenv删除环境变量unsetenv("TEST_ENV");printf("After unset, TEST_ENV: %s\n", getenv("TEST_ENV"));return 0;
}

在这个程序中,我们首先使用 getenv 函数来获取 PATH 环境变量的当前值。然后我们使用 setenv 函数来创建一个新的环境变量 TEST_ENV 并为它设置一个值。接下来,我们再一次使用 setenv 函数来修改 PATH 环境变量的值。最后,我们使用 unsetenv 函数来删除我们之前创建的 TEST_ENV 环境变量。我们可以看到,通过调用 getenv 函数,TEST_ENV 环境变量在被删除之后,返回的值为 NULL。 

2.进程间通信

管道是进程间通讯的一种实现

2.1无名管道

 父进程的任务:

#include<t_stdio.h>
#include<t_file.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
//进程间通信int main(){char buf[128];char * msg="this is a test..\n";int fd[2];//创建管道int pp =pipe(fd);if(pp==-1)E_MSG("pipe",-1); //创建子进程pid_t pid = fork();if(pid==-1)E_MSG("fork",-1);if(pid==0){//子进程close(fd[1]);//关闭写端//读取数据,如果管道没有数据,就阻塞等待int r = read(fd[0],buf,128);write(1,buf,r);//将buf输出到屏幕//关闭读端close(fd[0]);exit(0);}else {//父进程close(fd[0]);write(fd[1],msg,strlen(msg));close(fd[1]);wait(NULL);//阻塞等待子进程结束}return 0;
}

具体代码如上,我们首先创建无名管道,然后才能创建子进程,然后分别在父进程进行写入操作,记得关闭读操作,然后在子进程继续读操作,关闭写操作,具体操作如上

 2.2有名管道

有名管道(Named Pipe),也被称为FIFO(First In, First Out),是一种特殊类型的管道,与普通管道不同之处在于它有一个在文件系统中可见的路径名,这使得它可以在不相关的进程之间进行通信。有名管道提供了一种进程间通信的方式,允许不相关的进程通过读写同一个管道来进行数据交换。

在Unix/Linux系统中,有名管道通过mkfifo函数来创建。mkfifo函数创建一个新的FIFO文件,如果该文件已经存在,则不进行任何操作。mkfifo的原型如下:

#include <sys/types.h>
#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);
 

参数说明:

  • pathname:指定要创建的FIFO的路径名。
  • mode:指定FIFO的权限。通常使用八进制数表示,比如0666表示允许所有用户读写。

这里 我们创建三个文件来创建一个有名管道文件来进行读和写操作,来模拟不同进程之间的通信:
这是创建有名管道的函数:

#include<t_stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc,char * argv[]){//创建有名管道类型文件int ff = mkfifo(argv[1],0644);if(ff==-1)E_MSG("mkfifo",-1);printf("file ...%s success create\n",argv[1]);return 0;
}

这是向有名管道写入数据的函数: 

#include<t_stdio.h>
#include<t_stdio.h>
#include <asm-generic/fcntl.h>
#include<string.h>
int main(int argc, char * argv[]){char * msg="this is a test..\n";//打开文件,以写的方式打开int fd = open(argv[1],O_WRONLY);if(fd==-1)E_MSG("open",-1);write(fd,msg,strlen(msg));close(fd);return 0;
}

 这是向管道读数据的函数:

#include<t_stdio.h>
#include<t_stdio.h>
#include <asm-generic/fcntl.h>
#include<string.h>int main(int argc, char * argv[]){char buf[128];//打开文件,以写的方式打开int fd = open(argv[1],O_RDONLY);if(fd==-1)E_MSG("open",-1);int r= read(fd,buf,128);write(1,buf,r);close(fd);return 0;
}

写入和读数据必须在两个进程同时进行:

当在进程1中向管道写入数据时,会堵塞(这时管道文件数据为0),必须在另外一个进程2中读入数据,这样管到2就会输出“this is a test"。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【刷题】数据结构——树状数组

一、简介 树状数组用于两种操作&#xff1a; 快速求前缀和 O ( l o g n ) O(logn) O(logn)修改某一个数 O ( l o g n ) O(logn) O(logn) 这两个操作也可以用其他方法结构完成&#xff1a; 用一个数组存每个数&#xff1a;操作1. O ( n ) O(n) O(n)&#xff0c;遍历前n个数求…

Kubernetes(k8s)架构原理

比如在服务器上部署一个博客应用服务,但是太过受欢迎,访问量太大,应用服务经常会挂,使用自动重启工具,并且将应用服务部署在了好几个服务器上,总算抗住了。后来又上线了商城应用服务和语言应用服务,随着应用服务变多,需求也千奇百怪,有的应用服务不希望被外网访问,有…

[Flutter]打包IPA

1.直接使用Xcode运行iOS工程 不用flutter构建&#xff0c;在Xcode中是可以独立进行构建运行和打包发布的。 1).运行项目 先将flutter的build清理 $ flutter clean $ flutter pub get 然后立即用XCode打开iOS工程运行 运行会报错&#xff1a; error: The sandbox is not …

壁纸小程序Vue3(首页布局)

1.创建一个公共目录common来存放css和images App.vue中引用 <style lang"scss"> /*每个页面公共css */ import common/style/common-style.scss; </style> 2.渲染轮播图 <template><view class"homeLayout"><vi…

Godot 4 教程《勇者传说》依赖注入 学习笔记(0):环境配置

文章目录 前言相关地址环境配置初始化环境配置文件夹结构代码结构代码运行 资源文件导入像素风格窗口环境设置背景设置,Tileap使用自动TileMap 人物场景动画节点添加站立节点添加移动动画添加 通过依赖注入获取Godot的全局属性项目声明 当前项目逻辑讲解角色下降添加代码位置问…

【51单片机入门记录】IIC总线协议 EEPROM存储器AT24C02概述

一、IIC总线协议概述 &#xff08;1&#xff09;IIC&#xff08;Inter-IntegratedCircuit&#xff09;总线 是一种由PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器以及其外围设备。IIC也被成为I2C/IC&#xff0c;其实两者是完全相同的&#xff0c;只是名词不…

Linux(CentOS7)配置系统服务以及开机自启动

目录 前言 两种方式 /etc/systemd/system/ 进入 /etc/systemd/system/ 文件夹 创建 nginx.service 文件 重新加载 systemd 配置文件 ​编辑 配置开机自启 /etc/init.d/ 进入 /etc/init.d/ 文件夹 创建 mysql 文件 编写脚本内容 添加/删除系统服务 配置开机自启 …

精通Go语言文件上传:深入探讨r.FormFile函数的应用与优化

1. 介绍 1.1 概述 在 Web 开发中&#xff0c;文件上传是一项常见的功能需求&#xff0c;用于允许用户向服务器提交文件&#xff0c;如图像、文档、视频等。Go 语言作为一门强大的服务器端编程语言&#xff0c;提供了方便且高效的方式来处理文件上传操作。其中&#xff0c;r.F…

9.动态规划——2.最大序列和

例题——最大序列和 找状态 思路一&#xff08;&#xff09; 定义一个状态 d p [ i ] dp[i] dp[i]&#xff0c;计为前i个数构成子序列和的最大值 此法状态转移比较困难&#xff0c;即若 d p [ i ] dp[i] dp[i]与 d p [ i − 1 ] dp[i-1] dp[i−1]没有明确的关系&#xff0c;有…

Ribbon有哪些负载均衡策略

负载均衡类都实现了IRule接口。 RandomRule&#xff1a;随机的选用一个实例 RoundRobinRule&#xff1a;轮询的使用实例 RetryRule&#xff1a;在轮询的基础上加了一个错误重试机制&#xff0c;在deadline时间内会不断的重试 WeightResponeTimeRule&#xff1a;根据权重去做…

【计算机网络】四层负载均衡和七层负载均衡

前言 1、分层方式 首先我们知道&#xff0c;在计算机网络中&#xff0c;常用的协议分层方式&#xff1a;OSI和TCP/IP&#xff0c;以及实际生产中使用的协议划分方式。 在OSI中&#xff0c;各层的职责如下&#xff1a; 应用层&#xff1a;对软件提供接口以使程序能使用网络服…

深入探索位图技术:原理及应用

文章目录 一、引言二、位图&#xff08;Bitset&#xff09;基础知识1、位图的概念2、位图的表示3、位图操作 三、位图的应用场景1、数据查找与存储2、数据去重与排序 四、位图的实现 一、引言 位图&#xff0c;以其高效、简洁的特性在数据处理、存储和检索等多个领域发挥着举足…

Nest安装及使用~

前提条件 请确保您的操作系统上安装了 Node.js&#xff08;版本 > 16&#xff09; &#x1f4da;要查看指南&#xff0c;请访问 https://docs.nestjs.com/ &#x1f4da;要查看中文 指南&#xff0c; 请访问 https://docs.nestjs.cn/ $ node -v v16.18.1 $ npm -v 7.x.x安…

【C++】C++11的新特性

目录 一. 列表初始化1. 列表初始化的原理: initializer_list 二. 类型的声明1. auto2. decltype 三. nullptr四. 范围 for五. STL容器变化六. 类的新功能 一. 列表初始化 在 C 语言中, 就可以使用 {} 对数组或结构体进行初始化, 而 C11 扩大了 {} 的使用范围, 使其可以初始化所…

Mysql-数据库范式和Mysql安装

文章目录 数据库三范式第一范式&#xff1a;1NF第二范式&#xff1a;2NF第三范式&#xff1a;3NF Yum安装CentOS7 yum安装解决“Access denied”拒绝访问异常 数据库三范式 第一范式&#xff1a;1NF 第一范式&#xff1a;数据库中无重复的列&#xff0c;每一列都是不可分割的…

乐乐音乐鸿蒙版-支持krc歌词(动感歌词、翻译和音译歌词)

简介 乐乐音乐主要是基于HarmonyOS开发的音乐播放器&#xff0c;它支持lrc歌词和动感歌词(ksc歌词、krc歌词和hrc歌词等)、多种格式歌词转换器及制作动感歌词、翻译歌词和音译歌词。 开发环境 ArkTS、Stage模型、SDK3.1、 API 9 注&#xff1a;没试过在真机条件下调试。 功…

Java基础学习: JDK动态代理

文章目录 一、什么是JDK动态代理二、JDK动态代理的特点三、JDK动态代理类如何使用四、JDK动态代理原理分析1、创建代理对象2、生成代理类 一、什么是JDK动态代理 JDK动态代理是Java提供的一种动态生成代理类和代理对象的技术。它主要利用Java的反射机制实现&#xff0c;在运行…

Open CASCADE学习|GeomFill_Frenet

GeomFill_Frenet继承自GeomFill_TrihedronLaw类。GeomFill_Frenet类主要用于实现Frenet标架的计算。Frenet标架是一个沿曲线移动的局部坐标系&#xff0c;它由切向量、法向量和副法向量组成&#xff0c;常用于机器人学、计算机图形学等领域。 class GeomFill_Frenet : publi…

docker 数据卷

Docker数据卷是Docker中的一个核心机制&#xff0c;用于实现容器间数据的持久化和共享。它是宿主机上的一个特殊目录&#xff0c;可以供一个或多个容器使用。容器删除时&#xff0c;不会删除其挂载的数据卷&#xff0c;也不会存在类似的垃圾机制对容器存在的数据卷进行处理。 …

每日面经分享(Spring Boot: part2 DAO层)

1. Spring Boot DAO层的作用 a. 封装数据访问逻辑&#xff1a;DAO层的主要责任是封装与数据访问相关的逻辑。负责处理与数据库的交互&#xff0c;包括数据的增删改查等操作。通过将数据访问逻辑统一封装在DAO层中&#xff0c;可以提高代码的可维护性和可重用性。 b. 解耦业务逻…