Pipe - przesyłanie danych

0

Witam,
Mam do napisania dwa programy, które mają się ze sobą komunikować za pomocą pipe tak aby po wpisaniu liczby do pierwszego, drugi wyświetlał od razu ją na ekranie i dodatkowo magazynował ją w tablicy. Efekt mojej pracy widać poniżej. Niestety program nie działa.

PROGRAM 1:

#include <stdio.h>

int main(){
int pip[2],n,liczba,childpid,a=0;
float tab[256];
pipe(pip);
childpid=fork();
printf("Podaj liczbe liczb  do wyslania: ");
scanf("%d", &n);

if(childpid!=0)
{
close(pip[0]);
write(pip[1],n,sizeof(n));
while (a<n)
{
printf("Podaj %d liczbe: ", a+1);
scanf("%d". &tab[a]);
close(pip[0]);
write(pip[1], tab[a], sizeof(tab[a]));
a++;
}
}

}

PROGRAM 2:

#include <stdio.h>

int main(){
int pip[2],n,liczba,childpid,a=0;
float tab[256];
pipe(pip);
childpid=fork();
printf("Podaj liczbe liczb  do wyslania: ");
scanf("%d", &n);

if(childpid!=0)
{
close(pip[0]);
write(pip[1],n,sizeof(n));
while (a<n)
{
printf("Podaj %d liczbe: ", a+1);
scanf("%d". &tab[a]);
close(pip[0]);
write(pip[1], tab[a], sizeof(tab[a]));
a++;
}
}

}

Z góry dziękuję za jakąkolwiek pomoc!

1

Sprawdź dokładnie treść zadania - programy czy procesy ?

Jeśli to mają być dwa osobne programy - to nie wywołuj fork() (bo to nie ma zupełnie sensu) i zamiast pipe() użyj mkfifo()

Jeśli to mają być dwa procesy - to przykład takiego programu masz w manualu do pipe

      #include <sys/types.h>
       #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);
           }
       }

0

Faktycznie moje niedoczytanie. Chodziło o komunikację między procesami. A mógłbyś wskazać co w moim programie jest nie tak? Nie mieliśmy aż tylu bibliotek, a i gotowiec mi się nie widzi bo chyba nie o to chodzi :)

0

No to pytanie numer 1 - czy wiesz co robi fork() ?

0

Z tego co zrozumiałem tworzy połączenie pomiędzy procesem dziecko a rodzic.

0

Nie, fork() tworzy nowy proces (dziecko), który jest prawie dokładną kopią procesu bieżącego (rodzica).
Dziecko dziedziczy po rodzicu wiele rzeczy, ale Ciebie interesuje przede wszystkim to, że dziedziczy otwarte deskryptory plików (czyli to co dostajesz z pipe() )

Czyli startujemy w procesie głównym:

int pipefd[2];
pid_t cpid;

// tu tworzymy potok przy pomocy funkcji **pipe()**        
if (pipe(pipefd) == -1) {
  perror("pipe");
  exit(EXIT_FAILURE);
}

// a tu tworzymy proces potomny (dziecko)
cpid = fork();

// zakładając, że fork() się udał - od tego miejsca mamy już dwa procesy które wykonują ten sam kod !
// różnią się one m.in. wartością zmiennej cpid

if (cpid == 0) { // cpid ma wartość 0 w procesie potomnym
{
  do_fun_stuff_with_child(pipefd);
  exit(0);
}

// if-a kończę exit-em, zatem do tego miejsca dotrze tylko rodzic - bo dla rodzica cpid ma wartość >0
...

0

Zaczęło trybić :) Dziękuję za pomoc!

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