gpt4 book ai didi

读入协进程后挂起的子进程

转载 作者:太空狗 更新时间:2023-10-29 12:20:23 31 4
gpt4 key购买 nike

我正在使用管道编写协处理程序。当 child 读取一些数据、处理它并输出它时,它工作正常。但是当我读取所有数据并处理它时,它只是挂起。任何人有一些想法?谢谢。

这是源代码:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>


int main()
{
#define MAXSIZE 1024

char workload[MAXSIZE];
char result[MAXSIZE];
workload[strlen(workload)] = EOF;
int workload_size = strlen(workload);

int fd1[2], fd2[2];
int n;
pid_t pid;
if (pipe(fd1) < 0 || pipe(fd2) < 0) {
fprintf(stderr, "pipe error: %s\n", strerror(errno));
exit(1);
}

if ((pid = fork()) < 0) {
fprintf(stderr, "fork error: %s\n", strerror(errno));
exit(1);
} else if (pid > 0) {
close(fd1[0]);
close(fd2[1]);
while(fgets(workload, MAXSIZE, stdin) != NULL)
{
workload_size = strlen(workload);
if (write(fd1[1], workload, workload_size) != workload_size) {
fprintf(stderr, "write to pipe error: %s\n", strerror(errno));
exit(1);
}

if ((n = read(fd2[0], result, MAXSIZE)) < 0) {
fprintf(stderr, "read from pipe error: %s\n", strerror(errno));
exit(1);
}

if (n == 0) {
fprintf(stderr, "child closed the pipe\n");
exit(1);
}

result[n] = 0;

if (puts(result) == EOF) {
fprintf(stderr, "fputs error\n");
exit(1);
}
}
} else {
close(fd1[1]);
close(fd2[0]);
if (fd1[0] != STDIN_FILENO) {
if (dup2(fd1[0] ,STDIN_FILENO) != STDIN_FILENO) {
fprintf(stderr, "dup2 error to stdin.\n");
exit(1);
}
close(fd1[0]);
}
if (fd2[1] != STDOUT_FILENO) {
if (dup2(fd2[1] ,STDOUT_FILENO) != STDOUT_FILENO) {
fprintf(stderr, "dup2 error to stdout.\n");
exit(1);
}
close(fd2[1]);
}

if (execl("./a.out", "a.out", NULL) < 0) {
fprintf(stderr, "execl error: %s\n", strerror(errno));
exit(1);
}
exit(0);
}

return 0;
}

这是 a.out 的源代码,它适用于此:

#include <stdio.h>
#include <string.h>

int main()
{
#define MAXSIZE 1024
char x[MAXSIZE];
int n;
while(scanf("%s", x) != EOF)
{
printf("len:%d %s", strlen(x), x);
fflush(stdout);
}
return 0;
}

但是当我这样写代码时,它似乎只是悬而未决:

#include <stdio.h>
#include <string.h>

int main()
{
#define MAXSIZE 1024
char x[MAXSIZE];
int n;
while(scanf("%s", x) != EOF);
printf("Ok\n");
fflush(stdout);

return 0;
}

最佳答案

您使用 %s 调用 scanf 的方式可能会溢出 x 缓冲区。您至少应该使用宽度修饰符修改 scanf。

#include <stdio.h>
#include <string.h>

int main()
{
#define MAXSIZE 1024
char x[MAXSIZE];
int n;
while(scanf("%1024s", x) != EOF)
{
printf("len:%d %s", strlen(x), x);
fflush(stdout);
}
return 0;
}

对于您的其他程序也是如此。

你的程序被阻塞的原因是因为你的第二个 a.out 程序正在循环执行另一个 scanf,同时父程序正在尝试读取对 result 的响应。

关于读入协进程后挂起的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11149846/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com