我有一个关于在 C 中使用管道的问题。我想在主进程中有一个多维数组。该数组存储 24 行文本,一行包含 256 个字节(BUFFER)。这是我的代码。
顶部定义的缓冲区大小 = 256 字节
READ_END 定义在 TOP = 0
WRITE END DEFINED ON TOP = 1
char buffer[BUFFER_SIZE];
char *read_msg[100];
char *write_msg[100];
FILE *fp;
fp = fopen(argv[1], "r");
pid_t pid;
int fd[2];
pid = fork();
if (pid < 0) { // error
fprintf(stderr, "Fork Failed");
return 1;
}
if (pid == 0) { // child process does the time consuming task
close(fd[WRITE_END]);
read(fd[READ_END], &read_msg, 24*BUFFER_SIZE);
close(fd[READ_END]);
for (int i = 0; i < 24; ++i) {
printf("Received string: %s\n", read_msg[i]);
}
}
if (pid > 0) { // parent is responsive immediately
for (int i = 0; i < 24; ++i) {
if (fgets(buffer, sizeof(buffer), fp)) {
write_msg[i] = malloc(sizeof(buffer) + 1);
strcpy(write_msg[i], buffer);
}
}
close(fd[READ_END]);
write(fd[WRITE_END], &write_msg, 24*BUFFER_SIZE);
close(fd[WRITE_END]);
}
}
}
在子进程中,我想打印这些行,但它什么也没打印。我该如何解决?谢谢...
解决方案
char buffer[BUFFER_SIZE];
char read_msg[100][BUFFER_SIZE];
char write_msg[100][BUFFER_SIZE];
FILE *fp;
fp = fopen(argv[1], "r");
pid_t pid;
int fd[2];
管道(fd);
pid = fork();
if (pid < 0) { // error
fprintf(stderr, "Fork Failed");
return 1;
}
if (pid == 0) {
close(fd[WRITE_END]);
read(fd[READ_END], &read_msg, 24*BUFFER_SIZE);
close(fd[READ_END]);
for (int i = 0; i < 24; ++i) {
printf(read_msg[i]);
}
}
if (pid > 0) {
for (int i = 0; i < 24; ++i) {
if (fgets(buffer, sizeof(buffer), fp)) {
strcpy(write_msg[i], buffer);
}
}
close(fd[READ_END]);
write(fd[WRITE_END], &write_msg, 24*BUFFER_SIZE);
close(fd[WRITE_END]);
}
}
}
最佳答案
我忘了在 fork() 之前写 pipe(fd)。谢谢大家:)
关于c - C中的管道用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40565197/