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

news2024/11/16 12:04:39

目录

几个系统关键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);
        }
    }
}

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

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

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

相关文章

贪心算法三道经典题(买卖股票,分发饼干)

贪心算法 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 步骤&#xff1a; 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 分发饼干 LeetCode原题 找满足孩子数量的最大值———最优解问题 什么…

数据同步大冒险:PostgreSQL到MySQL的奇妙之旅

引言&#xff1a;一场跨数据库的浪漫邂逅 &#x1f491; 在数据的世界里&#xff0c;不同数据库系统就像是来自不同星球的恋人&#xff0c;它们各自拥有独特的魅力&#xff0c;但偶尔也会渴望一场跨越界限的亲密接触。今天&#xff0c;我们就来见证一场PostgreSQL与MySQL之间的…

初赛试题-2022年CSP-J3

先言 本次试卷 完善程序 三、完善程序&#xff08;每题3分&#xff0c;共30分&#xff09; &#xff08;1&#xff09; 【答案】 A B C D A &#xff08;2&#xff09; 【答案】 A B C D A

探索用于小占用关键词检测的TinyML框架:一个简明概述

目录 摘要 第一部分&#xff1a;引言 第二部分&#xff1a;部署TinyML的常见挑战 第三部分&#xff1a;SF-KWS的不同方法 A. 网络架构&#xff08;Network Architecture&#xff09; B. 学习技术&#xff08;Learning Techniques&#xff09; C. 模型压缩&#xff08;Mo…

最新黑名单查询录入系统PHP网站源码

源码介绍&#xff1a; 最新黑名单查询录入系统PHP网站源码 前端html 后端layui 操作部分都采用API接口的方式实线 集结了layui表格的多数据操作&#xff0c;添加&#xff0c;批量删除&#xff0c;分页&#xff0c;单项删除 后台数据修改采用绑定参数的形式来进行修改可以很…

C语言函数递归(含扫雷进阶思路)

文章目录 一、什么是递归二、递归的使用思路和限制条件1.递归的使用思路2.递归的限制条件 三、递归的举例举例1&#xff1a;求n的阶乘2.举例2&#xff1a;顺序打印⼀个整数的每⼀位 四、递归与迭代对比五、递归与迭代对比举例七、扫雷进阶思路 一、什么是递归 递归是学习C语⾔函…

暄桐教室分享“闲人”指南

一种理想的生活状态&#xff0c;叫“做个闲人”&#xff0c;如苏东坡《行香子述怀》那般&#xff0c;“对一张琴&#xff0c;一壶酒&#xff0c;一溪云”&#xff0c;放下纷扰&#xff0c;好自在。然而&#xff0c;闲并不是简单的无事可做&#xff0c;让自己时光充沛、能量聚集…

MacOS使用FileZilla通过ssh密钥文件连接远程服务器(已解决)

需求描述 mac电脑,使用filezilla通过FTP连接远程服务器,使用ssh密钥文件代替密码。 版本信息 MacOS:Sonoma 14.5 M3芯片 FileZilla:3.66.5 在这里插入图片描述 连接 1. 创建站点 打开filezilla工具,右上角选择“文件 -> 站点管理器”,打开站点管理器弹窗。 2.…

vue 动态替换父组件

替换父组件&#xff1f;&#xff1f; 什么鬼&#xff1f;&#xff1f;&#xff1f; 这个场景的确很少见&#xff01;&#xff01;不过我们要说的的确是要替换父组件&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 就是子组件内容不变但是父组件变…

【HuggingFace Transformers】LlamaDecoderLayer源码解析

LlamaDecoderLayer源码解析 1. LlamaDecoderLayer 介绍2. LlamaDecoderLayer 类源码解析 1. LlamaDecoderLayer 介绍 LlamaDecoderLayer 是 LLaMA 模型中的一个关键组件&#xff0c;它结合了自注意力机制、全连接层和残差连接&#xff0c;以及对输入数据的归一化。主要流程为&…

SpringCloud之一IDEA导入已有微服务项目并启动服务

一|、导入已有微服务项目 启动idea&#xff0c;file --> open&#xff0c;选择项目根目录&#xff1b;点击屏幕右侧maven projects按钮 -->点那个绿&#xff0c;如果屏幕右侧没有maven projects按钮&#xff0c;点击Help->Find Action&#xff0c;输入maven&#xff…

算法-存在重复元素(219)

这道题一眼看过去暴力&#xff0c;两层循环&#xff0c;找到相等的数字&#xff0c;然后判断一下就行&#xff0c;但是这样的话不符合哈希表使用原则。这道题同样利用了hash表键值配对的规则。 class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {M…

C语言 | Leetcode C语言题解之第382题链表随机节点

题目&#xff1a; 题解&#xff1a; typedef struct {struct ListNode * head; } Solution;Solution* solutionCreate(struct ListNode* head) {Solution * obj (Solution *)malloc(sizeof(Solution));assert(obj ! NULL);obj->head head;return obj; }int solutionGetRa…

keil中内存的存储规律

keil中内存的存储规律 keil中内存的存储规律 文章目录 keil中内存的存储规律keil中内存的存储规律 keil中内存的存储规律 #include <stdlib.h> #include "gd32f30x.h" #include "led_drv.h" #include "delay.h" #include "key_drv.…

GIT 下载安装使用教程

一. GIT下载 git下载地址https://git-scm.com/downloads 二. git安装 1. 许可声明 看完许可声明&#xff0c;点击Next就好了 2. 选择安装路径 默认为C盘&#xff0c;可以修改&#xff0c;这里修改为D盘&#xff0c;点击Next 3. 组件选择 勾选添加在桌面上&#xff0c;就是…

android gradle特别慢

gradle下载慢 修改gradle-wrapper.properties 替换https://services.gradle.org/distributions为https://mirrors.cloud.tencent.com/gradle distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/g…

jenkins发布文件到远程服务器

jenkins安装 安装教程 后台启动脚本 创建脚本&#xff1a;start_jenkins.sh ls for pid in $(ps -ef|grep jenkins.war|grep -v grep|cut -c 10-16); doecho $pid;kill -9 $pid; done;nohup java -Djava.awt.headlesstrue -jar /usr/local/jenkins/jenkins.war --webroot/…

Linux入门攻坚——30、sudo、vsftpd

su&#xff1a;Switch User&#xff0c;即切换用户 su [-l user] -c ‘COMMAND’ 如&#xff1a;su -l root -c ‘COMMAND’ 如果没有指定-l user&#xff0c;则默认是root sudo&#xff1a;可以让某个用户不需要拥有管理员的密码&#xff0c;而可以执行管理员的权限。 需…

RabbitMQ练习(Topics)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考&#xff1a;《RabbitMQ练习&#xff08;Hello World&#xff09;》和《RabbitMQ练习&#xff08;Work Queues&#xff09;》。 确保RabbitMQ、Sender、Receiver、Receiver2容器…

云原生向量数据库 PieCloudVector 助力多模态大模型 AI 应用

全球 AGI&#xff08;人工通用智能&#xff09;市场快速增长的背景下&#xff0c;企业应用成为推动这一领域发展的主要力量&#xff0c;企业如何选择合适的技术来支撑其智能化转型显得尤为重要。在墨天轮《数据库技术如何增强 AI 大模型&#xff1f;》数据库沙龙活动中&#xf…