📅  最后修改于: 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;
}
以上就是进程间通信中的各种资源。不同的进程间通信方式有各自的优缺点,选择合适的通信方式需要根据实际需求来决定。