首页 > 系统相关 >linux 进程间通信和信号处理

linux 进程间通信和信号处理

时间:2023-08-07 21:13:01浏览次数:42  
标签:include 示例 信号处理 间通信 key linux 进程 共享内存

进程间通信(Interprocess Communication,IPC)和信号处理是Linux系统中用于实现不同进程之间数据交换和协调的重要机制。以下是关于这两个概念的详细解释,并附带示例说明:

  1. 进程间通信(IPC):

    • 管道(Pipe):管道是一种半双工通信方式,可用于在父子进程之间传递数据。一个进程将数据写入管道,另一个进程从管道中读取数据。示例:在命令行中执行 ls | grep .txt,将ls的输出通过管道传递给grep进行过滤。

    • 消息队列(Message Queue):消息队列允许进程通过消息进行通信,每个消息都有优先级和类型。示例:两个进程之间使用消息队列来交换数据,如进程A向进程B发送一条消息。

    • 共享内存(Shared Memory):多个进程可以映射到同一块物理内存,实现高效的数据共享。示例:多个进程可以通过共享内存来共享一个计数器,实现并发计数。

    • 信号量(Semaphore):信号量用于控制多个进程对共享资源的访问,可以用于进程同步和互斥。示例:使用信号量来限制同时访问某个共享文件的进程数量。

  2. 信号处理:

    • SIGTERM:终止信号,通知进程要求它优雅地终止。示例:在终端中使用 kill PID 命令发送SIGTERM信号来终止进程。

    • SIGINT:终端中断信号,通常由Ctrl+C触发,用于中断正在执行的进程。示例:在终端中按下Ctrl+C中断正在运行的程序。

    • SIGKILL:杀死信号,强制终止进程,无法被捕获或忽略。示例:使用 kill -9 PID 命令发送SIGKILL信号来强制终止进程。

    • SIGUSR1 和 SIGUSR2:用户定义的信号,可以用于进程之间自定义通信。示例:进程A通过发送SIGUSR1信号来通知进程B执行特定操作。

  3. 套接字(Socket): 套接字是一种用于进程间通信的强大机制,不仅适用于本地进程通信,还可以在网络上实现进程之间的通信。套接字可以用于建立客户端-服务器模型,允许不同主机上的进程进行数据交换。示例:通过套接字在两台计算机之间传输文件或数据。

  4. 信号处理的示例: 假设有一个简单的C程序,我们希望在收到SIGINT信号(通常由Ctrl+C触发)时进行特定操作,比如打印一条消息然后退出。

    #include <stdio.h>
    #include <signal.h>
    #include <unistd.h>
    
    void sigint_handler(int signum) {
        printf("收到SIGINT信号,正在退出...\n");
        _exit(0);
    }
    
    int main() {
        // 注册信号处理函数
        signal(SIGINT, sigint_handler);
    
        printf("运行中,请按Ctrl+C终止...\n");
    
        while (1) {
            // 模拟进程工作
            sleep(1);
        }
    
        return 0;
    }

在这个示例中,当程序运行时,如果用户按下Ctrl+C,就会收到SIGINT信号,然后调用sigint_handler函数来处理信号,输出一条消息并退出程序。

使用共享内存进行进程间通信的示例: 假设有两个进程,一个进程写入数据到共享内存,另一个进程读取数据。以下是一个简单的示例:

进程A(写入数据):

#include <stdio.h>
#include <sys/shm.h>
#include <string.h>

int main() {
    key_t key = ftok("shmfile", 65);
    int shmid = shmget(key, 1024, 0666|IPC_CREAT);
    char *str = (char*) shmat(shmid, (void*)0, 0);

    strcpy(str, "Hello, shared memory!");

    shmdt(str);
    return 0;
}

进程B(读取数据):

#include <stdio.h>
#include <sys/shm.h>

int main() {
    key_t key = ftok("shmfile", 65);
    int shmid = shmget(key, 1024, 0666|IPC_CREAT);
    char *str = (char*) shmat(shmid, (void*)0, 0);

    printf("从共享内存读取的数据:%s\n", str);

    shmdt(str);
    shmctl(shmid, IPC_RMID, NULL);
    return 0;
}

这个示例中,进程A将数据写入共享内存,进程B从共享内存读取数据,并在完成后删除共享内存。

标签:include,示例,信号处理,间通信,key,linux,进程,共享内存
From: https://www.cnblogs.com/yund/p/17612721.html

相关文章

  • Mir 2.14 正式发布,Ubuntu 使用的 Linux 显示服务器
    Canonical公司最近发布了Mir2.14,这是该项目的最新版本。Mir2.14在Wayland方面通过ext-session-lock-v1协议增加了对屏幕锁定器(screenlockers)的支持,并最终支持Wayland拖放。此外还整合了渲染平台的实现,放弃了之前在RaspberryPi设备上使用的DispmanX平......
  • 谷歌Linux内核自动测试平台架构介绍-用自动测试测试难以测试的问题
    1摘要内核和硬件等低级系统已被证明极难进行有效测试,因此,许多内核测试都是以手动为主方式进行的。现有的大多数测试框架都是为测试与底层平台隔离的高级软件而设计的,而底层平台被假定是稳定可靠的。测试底层平台本身需要一套全新的假设,这些假设必须从根本上反映在框架的设计中。......
  • linux内网穿透应用场景有哪些?快解析有什么用处?
    随着网络技术的不断发展,无论是工作上还是在生活中人们对网络的依赖和需求越来越高。Linux内网穿透作为一种创新的解决方案,为我们提供了无限可能。首先我们了解一下Linux操作系统。Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程......
  • 【Linux】sz命令下载tar.gz,zip等文件到Windows解压时提示文件已损坏
    WinRAR打开提示:不可预料的压缩文件末端 用Bandzip打开提示:文件已损坏 用7Zip打开虽然不报错,但是发现文件缺失。开始以为是网络问题导致下载文件不全,但是对比文件大小发现一模一样。通过查看sz命令说明,解决办法为:下载的时候需要加上-be参数,明确指定下载的是二进制文件。......
  • Linux:防火墙iptables与firewalld的启停
    Linux关闭防火墙firewall和iptables命令_永久关闭iptables防火墙_红烧柯基的博客-CSDN博客Linux防火墙——iptables以及firewalld的使用介绍_树下一少年的博客-CSDN博客干货!Linux防火墙配置(iptables和firewalld)_数据包_规则_进行 iptables与firewalld1、状态syste......
  • linux循环语法错误笔记
     在freebsd上执行一个while循环,总是提示语法错误,查了许久资料,突然发现有人说到解释器问题,才焕然大悟,查看一下当前解释器:echo$SHELL果然,用的是csh,不是sh,也不是bash查看一下当前已安装解释器: cat/etc/shells那么就好说了,把命令写入脚本,然后用sh执行就行#!/bin/shwhile......
  • linux安装宋体字体
    如下:1、宋体字体安装描述:因流程服务中所选用的为宋体,而linux服务器本身没有宋体,因此需要额外安装宋体,安装字体步骤如下:(1)在自己的电脑windows中搜索宋体字体文件simsun.ttc(2)创建文件夹:/usr/share/fonts/zh_CN,并将字体文件拷贝到zh_CN中(3)修改字体权限,使root以外的用户可以使用......
  • 在AMD PetaLinux的systemd里启动后台命令的注意事项
    由于客户需要,需要在Linux里启动服务,使一个脚本在后台一直运行。于是创建一个systemd服务,使其运行顶层脚本,再在其中以后台运行方式启动另外一个长期运行脚本。结果发现,后台运行的长期运行脚本,过一段时间也退出了。经过调试和分析,发现systemd创建的后台进程,以“Type=forking”方......
  • Linux 中的零拷贝机制
    目录Zero-Copy机制内存管理物理内存和虚拟内存物理内存虚拟内存页表(PageTable)Linux体系结构内核空间和用户空间为什么需要区分内核空间与用户空间内核空间和用户空间内核空间用户空间LinuxI/O读写方式I/O中断原理DMA缓存I/O(BufferedI/O)直接I/O内存映射mmpSendfileSend......
  • Linux常用的shell命令汇总
    本文介绍Linux系统下常用的系统级命令,包括软硬件查看、修改命令,有CPU、内存、硬盘、网络、系统管理等命令。说明命令是在Centos6.464位的虚拟机系统进行测试的。本文介绍的命令都会在此Centos下运行验证(也有部分命令会在suse/ubuntu系统里测试的,会做特明说明),但运行结果就不再列出......