Pipe - przesyłanie danych

Odpowiedz Nowy wątek
2019-06-08 22:05
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!

Pozostało 580 znaków

2019-06-09 04:11
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);
           }
       }
programujesz w Fortranie? Karty perforowane? - MarekR22 2019-06-10 11:56
8 spacji wiodących w każdej linii. Tak był kiedyś wymóg dla Fortana, bo się pisało kod na kartach perforowanych i pierwsze 8 kolumn było miejscem zarezerwowanym na numer linii. - MarekR22 2019-06-10 13:34
Nie... to czyste lenistwo przy copy&paste z man pipe ;) - Bartłomiej Golenko 2019-06-10 13:35
@Bartłomiej Golenko: Jeśli to mają być dwa osobne programy - to nie wywołuj fork() niby dlaczego? Najprostsza definicja procesu to proces jest to program uruchomiony i wykonywany na komputerze. Dla mnie jak najbardziej można tak zrobić - Dregorio 2019-06-11 19:28
Masz program, uruchamiasz go - powstaje proces. Proces wywołuje pipe() i dostaje deskryptory we/wy potoku. Następnie proces wywołuje fork() - masz dwa procesy, przy czym dziecko "dziedziczy" otwarte deskryptory z rodzica. Oba "pochodzą" z jednego programu - mogą się przez te deskryptory komunikować. Jeśli masz dwa różne programy i oba uruchomisz - masz dwa procesy - ale w tym przypadku nie mogą się one komunikować przez pipe() - natomiast jak najbardziej mogą oba użyć mkfifo(). - Bartłomiej Golenko 2019-06-11 20:23

Pozostało 580 znaków

2019-06-11 19:16
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 :)

Pozostało 580 znaków

2019-06-11 20:19
0

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

Pozostało 580 znaków

2019-06-12 01:00
0

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

Pozostało 580 znaków

2019-06-12 01:38
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
...
edytowany 1x, ostatnio: Bartłomiej Golenko, 2019-06-12 01:39

Pozostało 580 znaków

2019-06-12 23:34
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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