Debian进程间如何通信

680
2025/3/16 18:32:33
栏目: 智能运维
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

在Debian系统中,进程间通信(IPC)可以通过多种方式实现。以下是一些常见的IPC方法:

1. 管道(Pipes)

  • 匿名管道:用于父子进程之间的通信。
  • 命名管道(FIFO):允许不相关的进程之间进行通信。
# 创建一个命名管道
mkfifo my_pipe

# 写入数据到管道
echo "Hello" > my_pipe

# 从管道读取数据
cat my_pipe

2. 消息队列(Message Queues)

  • 允许进程发送和接收消息。
# 安装msgget, msgsnd, msgrcv工具
sudo apt-get install msgget msgsnd msgrcv

# 创建消息队列
msgget -m 0666 -M 0666 my_queue

# 发送消息
echo "Hello" | msgsnd -m 0666 -M 0666 my_queue

# 接收消息
msgrcv -m 0666 -M 0666 my_queue

3. 共享内存(Shared Memory)

  • 允许多个进程访问同一块内存区域。
# 安装shmget, shmat, shmdt工具
sudo apt-get install shmget shmat shmdt

# 创建共享内存段
shmget -m 0666 -M 0666 1024

# 附加共享内存段
shmat -m 0666 -M 0666 1024

# 分离共享内存段
shmdt /dev/shm/shmXXXXX

4. 信号(Signals)

  • 用于进程间的异步通知。
#include <signal.h>
#include <stdio.h>

void handler(int signum) {
    printf("Received signal %d\n", signum);
}

int main() {
    signal(SIGINT, handler);
    while (1) {
        // 主循环
    }
    return 0;
}

5. 套接字(Sockets)

  • 支持本地和网络通信。

本地套接字(Unix Domain Sockets)

#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int sockfd;
    struct sockaddr_un addr;

    sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("socket");
        return 1;
    }

    addr.sun_family = AF_UNIX;
    strcpy(addr.sun_path, "/tmp/uds_example");

    unlink("/tmp/uds_example"); // 删除已存在的套接字文件
    bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));

    listen(sockfd, 5);
    int clientfd = accept(sockfd, NULL, NULL);

    char buffer[1024];
    read(clientfd, buffer, sizeof(buffer));
    printf("Received: %s\n", buffer);

    close(clientfd);
    close(sockfd);
    return 0;
}

网络套接字(TCP/UDP)

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int sockfd;
    struct sockaddr_in servaddr, cliaddr;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    memset(&servaddr, 0, sizeof(servaddr));
    memset(&cliaddr, 0, sizeof(cliaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = INADDR_ANY;
    servaddr.sin_port = htons(8080);

    bind(sockfd, (const struct sockaddr*)&servaddr, sizeof(servaddr));
    listen(sockfd, 10);

    int len = sizeof(cliaddr);
    int n = accept(sockfd, (struct sockaddr*)&cliaddr, &len);
    char buffer[1024];
    read(n, buffer, sizeof(buffer));
    printf("Received: %s\n", buffer);

    close(n);
    close(sockfd);
    return 0;
}

6. 信号量(Semaphores)

  • 用于进程同步和互斥。
# 安装semget, semop, semctl工具
sudo apt-get install semget semop semctl

# 创建信号量集
semget -m 0666 -M 0666 1

# 初始化信号量
semctl -m 0666 -M 0666 1 1

# 执行P操作(等待)
semop -m 0666 -M 0666 -P 1

# 执行V操作(释放)
semop -m 0666 -M 0666 -V 1

选择合适的IPC方法取决于具体的应用场景和需求。例如,共享内存适用于大量数据的快速传输,而消息队列则更适合于异步通信和解耦系统组件。

辰迅云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读: Debian GCC如何进行跨平台编译