Linux:进程池制作(匿名管道版本 & 命名管道版本)
以下是使用匿名管道和命名管道实现的进程池示例代码。
匿名管道版本:
#include <stdio.h>
#include <unistd.h>
int main() {
int fd[2];
pid_t pid;
char buf;
int i;
for(i = 0; i < 3; i++) {
if(pipe(fd) == -1) {
perror("pipe");
return 1;
}
if((pid = fork()) == -1) {
perror("fork");
return 1;
}
if(pid == 0) { // 子进程
close(fd[1]); // 子进程关闭写端
while(read(fd[0], &buf, 1) > 0) {
printf("Child %d received: %c\n", i, buf);
}
close(fd[0]);
_exit(0);
}
close(fd[0]); // 父进程关闭读端
buf = 'A' + i;
write(fd[1], &buf, 1); // 父进程通过写端发送数据
close(fd[1]);
waitpid(pid, NULL, 0); // 等待子进程结束
}
return 0;
}
命名管道版本:
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define PIPE_NAME "mypipe"
int main() {
int fd;
pid_t pid;
char buf;
int i;
for(i = 0; i < 3; i++) {
umask(0); // 设置文件权限掩码
if(mkfifo(PIPE_NAME, 0666) == -1) {
perror("mkfifo");
return 1;
}
if((pid = fork()) == -1) {
perror("fork");
return 1;
}
if(pid == 0) { // 子进程
fd = open(PIPE_NAME, O_RDONLY);
if(fd == -1) {
perror("open");
return 1;
}
while(read(fd, &buf, 1) > 0) {
printf("Child %d received: %c\n", i, buf);
}
close(fd);
_exit(0);
}
fd = open(PIPE_NAME, O_WRONLY);
if(fd == -1) {
perror("open");
return 1;
}
buf = 'A' + i;
write(fd, &buf, 1); // 父进程通过管道发送数据
close(fd);
waitpid(pid, NULL, 0); // 等待子进程结束
unlink(PIPE_NAME); // 删除命名管道
}
return 0;
}
这两个版本的代码都创建了三个进程,并且使用管道向它们发送数据。匿名管道版本使用无名管道(pipe),而命名管道版本使用命名管道(fifo)。每个子进程通过管道读取数据并打印,父进程通过管道写入数据。在子进程完成后,父进程等待子进程结束,并在匿名管道版本中关闭管道,在命名管道版本中删除管道文件。
评论已关闭