Linux进程间通信方式

一、管道通信

管道是最常用的进程间通信方式之一。管道通信采用先进先出原则,即写入的数据先被读出,没有被读取的数据会被存储在内核缓冲区中。管道通信一般用于有亲缘关系(父子进程或兄弟进程)的进程间通信。

下面是一个简单的管道通信示例:

int main(){
    int fd[2];
    pid_t pid;
    char readbuffer[80];
    pipe(fd);
    pid = fork();
    if(pid == 0){
        //子进程
        close(fd[0]);
        char *msg = "hello, parent process\n";
        write(fd[1],msg,strlen(msg)+1);
        close(fd[1]);
    }
    else{
        //父进程
        close(fd[1]);
        read(fd[0],readbuffer,sizeof(readbuffer));
        printf("message from child process: %s",readbuffer);
        close(fd[0]);
    }
    return 0;
}

二、消息队列通信

消息队列是一个消息链表,因此可以向任意进程发送消息。每个消息都有一个类型标识符和一个数据部分,可以通过操作系统提供的函数来发送和接收消息。

下面是一个简单的消息队列通信示例:

int main(){
    int msgid;
    key_t key;
    struct msgbuf{
        long mtype;
        char mtext[256];
    }msg;
    key = ftok("msgq_file",'b');
    msgid = msgget(key,IPC_CREAT | 0666);
    msg.mtype = 1;
    strcpy(msg.mtext,"message from process 1\n");
    msgsnd(msgid,&msg,sizeof(msg.mtext),0);
    msgctl(msgid,IPC_RMID,NULL);
    return 0;
}

三、共享内存通信

共享内存是最快的进程间通信方式之一,因为它不涉及到复制数据,而是把数据放置在一个共享的内存区域里。多个进程都可以访问这个区域,用于在进程间共享数据。

下面是一个简单的共享内存通信示例:

int main(){
    int shmid;
    char *shmaddr;
    key_t key;
    key = ftok("/dev/null", 1);
    shmid = shmget(key, 4096, IPC_CREAT | 0666);
    shmaddr = (char*)shmat(shmid,NULL,0);
    strcpy(shmaddr, "shared memory message");
    printf("message:%s", shmaddr);
    shmdt(shmaddr);
    shmctl(shmid,IPC_RMID,NULL);
    return 0;
}

四、信号通信

信号可以被用来通知其他进程某个事件的发生。进程可以定义一个信号处理函数来对信号进行处理。

下面是一个简单的信号通信示例:

#include 
#include 
#include 
void signal_handler(int signo){
    if(signo == SIGUSR1){
        printf("received SIGUSR1 signal\n");
    }
}
int main(){
    int pid;
    pid = fork();
    if(pid == 0){
        //子进程
        kill(getppid(),SIGUSR1);
        exit(0);
    }
    else{
        //父进程
        signal(SIGUSR1,signal_handler);
        pause();
    }
    return 0;
}

五、套接字通信

套接字通信是一种在网络上进行进程间通信的方式。套接字可以用于同一台计算机上的进程间通信,也可以用于不同计算机之间的进程间通信。

下面是一个简单的套接字通信示例:

#include 
#include 
#include 
#include 
#include 
int main(){
    int sockfd;
    char buffer[1024];
    struct sockaddr_in server_addr;
    sockfd = socket(AF_INET,SOCK_STREAM,0);
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    server_addr.sin_addr.s_addr = INADDR_ANY;
    bind(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr));
    listen(sockfd,10);
    while(1){
        int connfd = accept(sockfd,(struct sockaddr*)NULL,NULL);
        char *msg = "message from server\n";
        write(connfd,msg,strlen(msg));
        close(connfd);
    }
    return 0;
}

原创文章,作者:SWRXS,如若转载,请注明出处:https://www.506064.com/n/333411.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
SWRXS的头像SWRXS
上一篇 2025-02-01 13:34
下一篇 2025-02-01 13:34

相关推荐

  • 如何通过jstack工具列出假死的java进程

    假死的java进程是指在运行过程中出现了某些问题导致进程停止响应,此时无法通过正常的方式关闭或者重启该进程。在这种情况下,我们可以借助jstack工具来获取该进程的进程号和线程号,…

    编程 2025-04-29
  • Python缓存图片的处理方式

    本文将从多个方面详细阐述Python缓存图片的处理方式,包括缓存原理、缓存框架、缓存策略、缓存更新和缓存清除等方面。 一、缓存原理 缓存是一种提高应用程序性能的技术,在网络应用中流…

    编程 2025-04-29
  • Python在线编辑器的优势与实现方式

    Python在线编辑器是Python语言爱好者的重要工具之一,它可以让用户方便快捷的在线编码、调试和分享代码,无需在本地安装Python环境。本文将从多个方面对Python在线编辑…

    编程 2025-04-28
  • Java表单提交方式

    Java表单提交有两种方式,分别是get和post。下面我们将从以下几个方面详细阐述这两种方式。 一、get方式 1、什么是get方式 在get方式下,表单的数据会以查询字符串的形…

    编程 2025-04-27
  • 跨域通信浮标——实现客户端之间的跨域通信

    本文将介绍跨域通信浮标的使用方法,该浮标可以实现客户端之间的跨域通信,解决了浏览器同源策略的限制,让开发者能够更加方便地进行跨域通信。 一、浮标的原理 跨域通信浮标的原理是基于浮动…

    编程 2025-04-27
  • 用Pythonic的方式编写高效代码

    Pythonic是一种编程哲学,它强调Python编程风格的简单、清晰、优雅和明确。Python应该描述为一种语言而不是一种编程语言。Pythonic的编程方式不仅可以使我们在编码…

    编程 2025-04-27
  • Java多版本支持实现方式

    本文将从以下几个方面阐述如何实现Java多版本支持,并给出可行的代码示例。 一、多版本Java环境概述 Java是一门跨平台的编程语言,但是在不同的应用场景下,可能需要使用不同版本…

    编程 2025-04-27
  • SpringBoot Get方式请求传参用法介绍

    本文将从以下多个方面对SpringBoot Get方式请求传参做详细的阐述,包括URL传参、路径传参、请求头传参、请求体传参等,帮助读者更加深入地了解Get请求方式下传参的相关知识…

    编程 2025-04-27
  • Java中的僵尸进程简介与解决方法

    本文将对Java中的僵尸进程进行详细阐述,并给出几种解决方法。 一、僵尸进程的概念 在操作系统中,进程是指正在执行的程序。当一个进程创建了一个子进程,而该子进程完成了任务却没有被父…

    编程 2025-04-27
  • 通信专业Python和Java的开发技巧

    本文旨在介绍通信专业Python和Java的开发技巧,为读者提供实用且可操作的思路和方法。 一、Python在通信领域中的应用 Python是一种优秀的程序设计语言,因其易学易用、…

    编程 2025-04-27

发表回复

登录后才能评论