Ćwiczenia z pipe

0
  1. Zbudować dwa procesy (producent -> konsument)
    Producent czyta konsumenta (np. z klawiatury)

    • jednostką danych jest wiersz

    stdin --> [producent] -- pipe -- [konsument] --> stdout

    via pipe przesyłamy wczytane dane (komunikat) do procesu konsumenta (odbiorcy)

    • zawiera: Nazwisko, PID producenta, dane

    konsument odczytuje z pipe'a i wywala go na stdout (printf)

    • zawiera: Nazwisko, PID odbiorcy, dane

Mógł bym prosić o jakieś wskazówki? Kroki postępowania? Zestaw funkcji do użycia? Wolał bym uniknąć kopania w złym kierunku :)

0

http://linux.die.net/man/2/pipe

Reszte chyba ogarniesz.

0
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int
main(int argc, char *argv[])
{
    int pipefd[2];
    pid_t cpid;
    char buf;
    if (argc != 2) {
    fprintf(stderr, "Usage: %s <string>\n", argv[0]);
    exit(EXIT_FAILURE);
    }
    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }
    cpid = fork();
    if (cpid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    if (cpid == 0) {    /* Child reads from pipe */
        close(pipefd[1]);          /* Close unused write end */
        while (read(pipefd[0], &buf, 1) > 0)
            write(STDOUT_FILENO, &buf, 1);
        write(STDOUT_FILENO, "\n", 1);
        close(pipefd[0]);
        _exit(EXIT_SUCCESS);
    } else {            /* Parent writes argv[1] to pipe */
        close(pipefd[0]);          /* Close unused read end */
        write(pipefd[1], argv[1], strlen(argv[1]));
        close(pipefd[1]);          /* Reader will see EOF */
        wait(NULL);                /* Wait for child */
        exit(EXIT_SUCCESS);
    }
}

Całkiem miły kod w przykładzie, na pewno z niego coś wycisnę, natomiast mam pytanie:

    if (cpid == 0) {    /* Child reads from pipe */
/* bla bla */
    } else {            /* Parent writes argv[1] to pipe */

Od czego zależy takie potoczenie się programu przy takim wywołaniu fork'a?

cpid = fork();
1

fork() to specyficzna funkcja. Wraca ona 2! razy. Jesli wynikiem powrotu jest 0, to jest to proces-dziecko, jesli liczba wieksza niz zero proces-rodzic, jesli -1 blad.
Standardowe uzycie tej funkcji jest mniej-wiecej takie:

pid_t pid = fork();
switch(pid) {
  case -1: // error
  case 0: // to co ma wykonac dziecko, po czym (najczesciej) exit()
  default: // to co ma wykonac rodzic
}

Dodatkowo fork() wykonuje caly kod od miejsca wystapienia do zakonczenia programu. Dlatego tez najczesciej sie konczy proces-dziecko funkcja exit(). Przechowuje ona rowniez wszystkie otwarte deskryptory. Wiecej informacji na ten temat: http://linux.die.net/man/2/fork lub man fork.

1 użytkowników online, w tym zalogowanych: 0, gości: 1