PingPong по 1 трубе и 1 сигналу: чего ждет scanf? - PullRequest
0 голосов
/ 30 ноября 2018

Я написал PingPong на C по 1 сигналу и 1 трубе, поэтому мне нужно отправить pid1 на son2 и pid2 на son1, где pid1, pid2 это pids of son1, son2.

Но я вижу эту картинку:

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;
}

Этотусоваться до scanf в son2 в SIGUSR1_hdl.Что я делаю неправильно?Я не могу наследовать pids вилкой.Я должен отправить его только через мой канал (fd).

1 Ответ

0 голосов
/ 30 ноября 2018

Основная проблема (помимо используемых вами функций небезопасных сигналов) заключается в том, что когда stdin подключен к нетерминальному входу, он полностью буферизуется .Это означает, что когда вы пытаетесь читать из stdin (что и делает scanf), он будет пытаться заполнить буфер как можно больше.

Это означает, что один дочерний процесс будет читать все данные, которые вы записали в канал, не оставляя ни одного для другого дочернего процесса, что, конечно, заставляет scanf бесконечно блокировать.

Либо вам нужно использовать два канала, по одному для каждогодочерний процесс или какой-то другой способ синхронизации между процессами.

...