📜  进程间通信-资源(1)

📅  最后修改于: 2023-12-03 15:12:20.139000             🧑  作者: Mango

进程间通信-资源

在操作系统中,进程间通信是一种重要的通信方式,它允许两个或多个进程之间交换数据和消息。进程之间的通信需要共享资源,这些资源包括文件、管道、消息队列、共享内存等。

文件共享

文件共享是进程间通信的一种基本形式,它能够允许多个进程同时访问同一个文件。在Linux系统中,文件共享通常使用文件描述符实现。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    int fd;
    char buf[10];

    fd = open("test.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    read(fd, buf, 10);
    printf("%s\n", buf);

    close(fd);

    return 0;
}
管道通信

管道是一种进程间通信的高级形式,它能够连接两个进程,并允许它们通过管道相互通信。在Linux系统中,管道分为匿名管道和命名管道两种类型。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    int fd[2];
    pid_t pid;
    char buf[256];

    if (pipe(fd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    pid = fork();
    if (pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        close(fd[0]);
        write(fd[1], "Hello, parent!", 14);
        exit(EXIT_SUCCESS);
    } else {
        close(fd[1]);
        read(fd[0], buf, 256);
        printf("%s\n", buf);
    }

    return 0;
}
消息队列通信

消息队列是一种高效的进程间通信方式,它能够允许多个进程之间通过消息队列相互通信。在Linux系统中,消息队列通信需要使用IPC(Inter-Process Communication)机制实现。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>

struct msgbuf {
    long mtype;
    char mtext[256];
};

int main() {
    int msqid;
    pid_t pid;
    struct msgbuf msg;

    msqid = msgget(IPC_PRIVATE, 0666);
    if (msqid == -1) {
        perror("msgget");
        exit(EXIT_FAILURE);
    }

    pid = fork();
    if (pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        msg.mtype = 1;
        sprintf(msg.mtext, "Hello, parent!");
        msgsnd(msqid, &msg, sizeof(msg.mtext), 0);
        exit(EXIT_SUCCESS);
    } else {
        msgrcv(msqid, &msg, sizeof(msg.mtext), 1, 0);
        printf("%s\n", msg.mtext);
        msgctl(msqid, IPC_RMID, NULL);
    }

    return 0;
}
共享内存通信

共享内存是一种高效的进程间通信方式,它能够允许多个进程之间通过共享内存相互通信。在Linux系统中,共享内存通信需要使用shmget()函数创建共享内存区域,shmat()函数将共享内存区域映射到进程地址空间中。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHMSIZE 1024

int main() {
    int shmid;
    pid_t pid;
    char *shmaddr;

    shmid = shmget(IPC_PRIVATE, SHMSIZE, 0666);
    if (shmid == -1) {
        perror("shmget");
        exit(EXIT_FAILURE);
    }

    pid = fork();
    if (pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        shmaddr = shmat(shmid, NULL, 0);
        sprintf(shmaddr, "Hello, parent!");
        shmdt(shmaddr);
        exit(EXIT_SUCCESS);
    } else {
        shmaddr = shmat(shmid, NULL, 0);
        printf("%s\n", shmaddr);
        shmdt(shmaddr);
        shmctl(shmid, IPC_RMID, NULL);
    }

    return 0;
}

以上就是进程间通信中的各种资源。不同的进程间通信方式有各自的优缺点,选择合适的通信方式需要根据实际需求来决定。