进程间通信(Inter-Process Communication,IPC)是操作系统提供的一种机制,用于不同进程之间的数据交换和同步。以下是一些常见的进程间通信方式:
1. 管道(Pipe)
单向:只能用于具有亲缘关系的进程间通信,如父子进程。
双向:可以使用两个管道实现。
2. 命名管道(Named Pipe)
可以在任意两个进程间通信,不限于亲缘关系。
3. 信号量(Semaphore)
用于进程同步,实现互斥访问共享资源。
4. 消息队列(Message Queue)
可以在多个进程间传递消息。
5. 信号(Signal)
用于通知进程某个事件发生。
6. 共享内存(Shared Memory)
多个进程可以访问同一块内存,效率较高。
7. 套接字(Socket)
用于网络通信,也可以用于本地进程间通信。
以下是一些具体的实现方法:
管道和命名管道
```c
// 创建管道
int pipe(int pipefd[2]);
// 创建命名管道
int mkfifo(const char path, mode_t mode);
// 管道读写
read(pipefd[0], buffer, size);
write(pipefd[1], message, size);
```
消息队列
```c
// 创建消息队列
int msgget(key_t key, int msgflg);
// 发送消息
int msgsnd(int msqid, const msgbuf_t msgp, size_t msgsz, int msgflg);
// 接收消息
int msgrcv(int msqid, msgbuf_t msgp, size_t msgsz, long msgtyp, int msgflg);
```
共享内存
```c
// 创建共享内存
int shmget(key_t key, size_t size, int shmflg);
// 连接到共享内存
void shmat(int shmid, const void shmaddr, int shmflg);
// 分离共享内存
int shmdt(const void shmaddr);
// 删除共享内存
int shmctl(int shmid, int cmd, struct shmid_ds buf);
```
套接字
```c
// 创建套接字
int socket(int domain, int type, int protocol);
// 绑定套接字
int bind(int sockfd, const struct sockaddr addr, socklen_t addrlen);
// 监听套接字
int listen(int sockfd, int backlog);
// 接受连接
int accept(int sockfd, struct sockaddr addr, socklen_t addrlen);
// 发送数据
int send(int sockfd, const void buf, size_t len, int flags);
// 接收数据
int recv(int sockfd, void buf, size_t len, int flags);
```
选择合适的进程间通信方式取决于具体的应用场景和需求。希望这些信息能帮助你!