Verwenden der Poll-Funktion mit gepufferten Streams

Ich versuche, ein Client-Server-Kommunikationssystem mit dem zu implementierenUmfrage Funktion in C. Der Fluss ist wie folgt:

Hauptprogramm gibt einen Unterprozess ausUntergeordneter Prozess ruft das aufexec auszuführende Funktionsome_binaryEltern und Kinder senden sich abwechselnd Nachrichten. Jede gesendete Nachricht hängt von der zuletzt empfangenen Nachricht ab.

Ich habe versucht, dies mit zu implementierenpoll, stieß aber auf Probleme, weil der untergeordnete Prozess seine Ausgabe puffert, wodurch meinepoll Anrufe zur Zeitüberschreitung. Hier ist mein Code:

int main() {
char *buffer = (char *) malloc(1000);
int n;

pid_t pid; /* pid of child process */

int rpipe[2]; /* pipe used to read from child process */
int wpipe[2]; /* pipe used to write to child process */
pipe(rpipe);
pipe(wpipe);

pid = fork();
if (pid == (pid_t) 0)
{
    /* child */

    dup2(wpipe[0], STDIN_FILENO);
    dup2(rpipe[1], STDOUT_FILENO);
    close(wpipe[0]); close(rpipe[0]);
    close(wpipe[1]); close(rpipe[1]);
    if (execl("./server", "./server", (char *) NULL) == -1)
    {
        fprintf(stderr, "exec failed\n");
        return EXIT_FAILURE;
    }       
    return EXIT_SUCCESS;
}
else
{
    /* parent */

    /* close the other ends */
    close(wpipe[0]);
    close(rpipe[1]);

    /* 
      poll to check if write is good to go 
                This poll succeeds, write goes through
        */
    struct pollfd pfds[1];
    pfds[0].fd = wpipe[1];
    pfds[0].events = POLLIN | POLLOUT;
    int pres = poll(pfds, (nfds_t) 1, 1000);
    if (pres > 0)
    {
        if (pfds[0].revents & POLLOUT)
        {
            printf("Writing data...\n");
            write(wpipe[1], "hello\n", 6);
        }
    }

    /* 
        poll to check if there's something to read.
        This poll times out because the child buffers its stdout stream.
    */
    pfds[0].fd = rpipe[0];
    pfds[0].events = POLLIN | POLLOUT;
    pres = poll(pfds, (nfds_t) 1, 1000);
    if (pres > 0)
    {
        if (pfds[0].revents & POLLIN)
        {
            printf("Reading data...\n");
            int n = read(rpipe[0], buffer, 1000);
            buffer[n] = '\0';
            printf("child says:\n%s\n", buffer);
        }
    }

    kill(pid, SIGTERM);
    return EXIT_SUCCESS;
}
}

Der Servercode lautet einfach:

int main() {
    char *buffer = (char *) malloc(1000);

    while (scanf("%s", buffer) != EOF)
    {
        printf("I received %s\n", buffer);
    }   
    return 0;
}

Wie verhindere ichpoll Anrufe aus Zeitüberschreitung wegen Pufferung?

BEARBEITEN:

Ich möchte, dass das Programm auch dann funktioniert, wenn dieexeced binary ist extern, d. h. ich habe keine Kontrolle über den Code - wie ein Unix-Befehl, z.cat oderls.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage