linux 两个main函数运行的程序进行通信例子
时间: 2024-09-13 18:03:00 浏览: 48
在Linux环境下,两个具有主函数(main)的程序进行通信通常可以使用共享内存、管道(pipe)、消息队列(msg_queue)、信号量(semaphores)或者套接字(socket)等机制。这里我将简单介绍通过管道和共享内存的例子。
**通过管道通信(Pipe):**
假设有一个父进程(parent_main)创建一个管道,并启动子进程(child_main),子进程读取管道内容,然后父进程写入数据。例如:
```c
// parent_main.c
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t child_pid = fork();
if (child_pid == 0) { // 子进程
close(0); // 关闭标准输入
dup2(fd[1], 0); // 将管道连接到新标准输入
char data[] = "Hello from parent";
write(fd[0], data, strlen(data));
exit(0);
} else {
close(fd[1]); // 父进程关闭写端
char buffer[256];
read(fd[0], buffer, sizeof(buffer)); // 父进程读取
printf("Received: %s\n", buffer);
wait(NULL); // 等待子进程结束
}
return 0;
}
```
**通过共享内存通信(Shared Memory):**
使用`shmget()`和`shmat()`系统调用创建和映射共享内存区域:
```c
// shared_memory.c
#include <sys/ipc.h>
#include <sys/shm.h>
void* create_shared_memory(int size) {
key_t key = ftok("/tmp", 'S'); // 创建键
int shmid = shmget(key, size, 0644 | IPC_CREAT); // 创建或获取共享内存
void *ptr = shmat(shmid, NULL, 0); // 映射到进程地址空间
return ptr;
}
// 在每个main中,先初始化共享内存,然后操作它
int main() {
void *shared_data = create_shared_memory(sizeof(char) * 20);
// ...对共享内存进行读写操作...
munmap(shared_data, sizeof(char) * 20); // 释放内存
return 0;
}
```
阅读全文