在Linux中,进程间通信(IPC)主要有以下几种方式:
- 信号(Signal):
- 发送信号:kill -SIGUSR1 1234 向进程1234发送SIGUSR1信号。
- 信号处理函数:void signal_handler(int signum)
例如:
// 信号处理函数
void signal_handler(int signum) {
if (signum == SIGUSR1) {
// 收到SIGUSR1信号
...
}
}
int main() {
// 注册信号处理函数
signal(SIGUSR1, signal_handler);
...
}
- 管道(Pipe):
- 创建管道:int pipefd[2]; pipe(pipefd);
- 进程A写入管道:write(pipefd[1], “Hello”, 6);
- 进程B从管道读取:read(pipefd[0], buf, sizeof(buf));
例如:
// 进程A
int main() {
int pipefd[2];
pipe(pipefd);
write(pipefd[1], "Hello", 6);
}
// 进程B
int main() {
int pipefd[2];
pipe(pipefd);
char buf[6];
read(pipefd[0], buf, sizeof(buf));
printf("%s", buf); // Hello
}
- 消息队列(Message Queue):
- 创建消息队列:mqd_t mq_open(“/mq”, O_CREAT);
- 发送消息:mq_send(mqd, msg, sizeof(msg), 0);
- 接收消息:mq_receive(mqd, buf, sizeof(buf), NULL);
例如:
// 进程A
int main() {
mqd_t mqd = mq_open("/mq", O_CREAT);
char msg[] = "Hello";
mq_send(mqd, msg, sizeof(msg), 0);
}
// 进程B
int main() {
mqd_t mqd = mq_open("/mq", O_CREAT);
char buf[6];
mq_receive(mqd, buf, sizeof(buf), NULL);
printf("%s", buf); // Hello
}
- 共享内存(Shared Memory):
- 创建共享内存:int shm_fd = shm_open(“/shm”, O_CREAT, 0644);
- 映射共享内存:void *shm_ptr = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0);
- 访问共享内存:shm_ptr[0] = ‘x’;