gpt4 book ai didi

c - PingPong 由 1 个管道和 1 个信号 : what is scanf waiting for?

转载 作者:行者123 更新时间:2023-11-30 16:24:56 25 4
gpt4 key购买 nike

我已经通过 1 个信号和 1 个管道在 C 上编写了 PingPong,因此我需要将 pid1 发送到 son2 pid2son1,其中 pid1pid2son1son2< 的 pid/.

但我看到这张图片:

Waiting..

PID: 4021

Waiting..

我有这个代码:

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/wait.h>
#include <unistd.h>

int pidN;
int pid = -1;
int fd[2];
int max;

void SIGUSR1_hdl(int sig)
{
// Set pid
if (pid == -1) {
printf("Waiting..\n");
fflush(stdout);
scanf("%d", &pid);
printf("PID: %d\n", pid);
fflush(stdout);
kill(pid, SIGUSR1);
signal(SIGUSR1, SIGUSR1_hdl);
return;
}
// Read x
..
}

int main(int argc, const char **argv)
{
signal(SIGUSR1, SIGUSR1_hdl);
sscanf(argv[1], "%d", &max);
pipe(fd);
dup2(fd[0], STDIN_FILENO);
close(fd[0]);

int pid1;
if (!(pid1 = fork())) {
pidN = 1;
for (;;) pause();
}

int pid2;
if (!(pid2 = fork())) {
pidN = 2;
for (;;) pause();
}

kill(pid1, SIGUSR1);
dprintf(fd[1], "%d\n%d\n%d\n", pid2, pid1, 1);
close(fd[1]);
wait(NULL);
wait(NULL);

return 0;
}

它在 SIGUSR1_hdl 中的 son2 中的 scanf 之前挂出。我究竟做错了什么?我无法通过 fork 继承 pid。我只能通过我的 channel (fd) 发送它。

最佳答案

主要问题(除了您使用的信号不安全函数之外)是,当 stdin 连接到非终端输入时,它是完全缓冲的。这意味着当您尝试从 stdin 读取(这就是 scanf 的作用)时,它将尝试尽可能多地填充缓冲区。

这意味着单个子进程将读取您写入管道的所有数据,不会为其他子进程留下任何数据,这当然会导致scanf无限阻止。

您需要使用两个管道,每个子进程一个,或者进程之间的某种其他同步方式。

关于c - PingPong 由 1 个管道和 1 个信号 : what is scanf waiting for?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53556546/

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