编写代码实现进程间的命名管道通信,要求创建管道实现每隔2秒种自动输出用C语言
时间: 2024-10-25 09:12:45 浏览: 27
在C语言中,我们可以使用`unistd.h`头文件中的`pipe()`函数来创建一个命名管道,然后利用`fork()`和`waitpid()`系统调用来实现在父进程中启动子进程并监听,子进程定时输出信息。下面是一个简单的示例:
```c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define PIPE_NAME "/tmp/my_pipe"
int main() {
// 创建管道
int pipe_fds[2];
if (pipe(pipe_fds) == -1) {
perror("Failed to create pipe");
return 1;
}
pid_t child_pid = fork();
// 父进程操作
if (child_pid == 0) { // 子进程
close(pipe_fds[0]); // 关闭读端
char msg[] = "Output from Child Process\n";
write(pipe_fds[1], msg, strlen(msg) + 1); // 写入数据
exit(0);
} else if (child_pid > 0) { // 父进程
close(pipe_fds[1]); // 父进程关闭写端
while (true) {
// 检查是否有子进程结束
wait(NULL);
// 每隔两秒再次尝试打开读端
sleep(2);
if (open(PIPE_NAME, O_RDONLY) != -1) {
char buffer[100];
ssize_t bytes_read = read(pipe_fds[0], buffer, sizeof(buffer));
printf("Received: %s", buffer);
close(pipe_fds[0]);
}
}
} else {
perror("Fork failed");
return 1;
}
return 0;
}
```
在这个例子中,我们首先创建了一个管道,然后在父进程中通过`waitpid()`循环监控子进程是否退出。每间隔2秒,父进程会尝试打开命名管道进行读取。子进程会在创建后立即写入一条消息,然后结束。
阅读全文