Pipe - przesyłanie danych

Pipe - przesyłanie danych
VK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:31
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:

Kopiuj
#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:

Kopiuj
#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!

BG
  • Rejestracja:prawie 6 lat
  • Ostatnio:2 dni
  • Postów:289
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

Kopiuj
      #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);
           }
       }

Zobacz pozostały 1 komentarz
MarekR22
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.
BG
Nie... to czyste lenistwo przy copy&paste z man pipe ;)
DR
@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ć
BG
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().
VK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:31
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 :)

BG
  • Rejestracja:prawie 6 lat
  • Ostatnio:2 dni
  • Postów:289
0

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

VK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:31
0

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

BG
  • Rejestracja:prawie 6 lat
  • Ostatnio:2 dni
  • Postów:289
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:

Kopiuj
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
VK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:31
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.