进程通信实验代码 linux
时间: 2024-01-31 09:02:17 浏览: 82
Linux进程通信代码
以下是一个简单的 Linux 进程通信实验代码:
**管道通信**
管道是一个半双工的通信机制,只能单向传输数据。在 Linux 中,使用 `pipe()` 系统调用可以创建一个管道。
```c
#include <stdio.h>
#include <unistd.h>
int main()
{
int fd[2];
pid_t pid;
char buf[100];
if (pipe(fd) < 0) {
printf("Failed to create pipe.\n");
return -1;
}
pid = fork();
if (pid < 0) {
printf("Failed to create child process.\n");
return -1;
} else if (pid == 0) { // 子进程
close(fd[1]); // 关闭管道写入端
read(fd[0], buf, sizeof(buf)); // 读取管道内容
printf("Child process received message: %s\n", buf);
close(fd[0]);
} else { // 父进程
close(fd[0]); // 关闭管道读取端
write(fd[1], "Hello, child process!", 22); // 向管道写入内容
close(fd[1]);
}
return 0;
}
```
该程序创建了一个管道,并在父子进程之间传输了一条消息。
**消息队列通信**
消息队列通信是一种进程间通信的方式,可以在多个进程之间传输数据。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct msgbuf {
long mtype;
char mtext[100];
};
int main()
{
int msgid;
pid_t pid;
struct msgbuf msg;
msgid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT); // 创建消息队列
if (msgid < 0) {
printf("Failed to create message queue.\n");
return -1;
}
pid = fork();
if (pid < 0) {
printf("Failed to create child process.\n");
return -1;
} else if (pid == 0) { // 子进程
msgrcv(msgid, &msg, sizeof(msg), 1, 0); // 从消息队列中读取消息
printf("Child process received message: %s\n", msg.mtext);
msgctl(msgid, IPC_RMID, NULL); // 删除消息队列
} else { // 父进程
strncpy(msg.mtext, "Hello, child process!", sizeof(msg.mtext) - 1);
msg.mtype = 1;
msgsnd(msgid, &msg, sizeof(msg), 0); // 向消息队列中发送消息
}
return 0;
}
```
该程序创建了一个消息队列,并在父子进程之间传输了一条消息。
**共享内存通信**
共享内存通信是一种进程间通信的方式,可以在多个进程之间共享内存区域。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main()
{
int shmid;
pid_t pid;
char *shmaddr;
shmid = shmget(IPC_PRIVATE, 1024, 0666 | IPC_CREAT); // 创建共享内存
if (shmid < 0) {
printf("Failed to create shared memory.\n");
return -1;
}
pid = fork();
if (pid < 0) {
printf("Failed to create child process.\n");
return -1;
} else if (pid == 0) { // 子进程
shmaddr = shmat(shmid, NULL, 0); // 连接共享内存
printf("Child process received message: %s\n", shmaddr); // 读取共享内存内容
shmdt(shmaddr); // 分离共享内存
shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
} else { // 父进程
shmaddr = shmat(shmid, NULL, 0); // 连接共享内存
strncpy(shmaddr, "Hello, child process!", 1024); // 写入共享内存内容
shmdt(shmaddr); // 分离共享内存
}
return 0;
}
```
该程序创建了一个共享内存区域,并在父子进程之间共享了一段内存区域。
阅读全文