• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Programowanie w C - Potoki

0 głosów
1,231 wizyt
pytanie zadane 9 kwietnia 2018 w C i C++ przez MrFraxis Początkujący (390 p.)

Witam,

Mam do napisania w C dwa programiki działające w terminalu. Ogółem idea zadania jest taka, że wykorzystując "potoki" mają działać tak, że w pierwszej konsoli wpisuję jakiś tekst, powiedzmy "abcdabcd" a w drugiej konsoli ma się ten tekst wyświetlić. Niestety kompletnie nie rozumiem idei potoków a programy, które napisałem z kolegami nie działają (chyba)...

Wyglądają one tak:

#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char* argv[]){  
   int mysize=50;
   char*buf1[50];
   char*buf2[50];
   char* myfifo="/tmp/myfilo";
   mkfifo(myfifo,0666);
   int fd=open(myfifo,O_RDONLY);
   read(fd, buf1, mysize);
   close(fd);
   fd=open(myfifo,O_WRONLY);
   write(fd, buf2, mysize);
   close (fd);
   return 0;
}

-------------------------------DRUGI PROGRAM --------------------------------------

#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){  
   int msgSize=10;
   char* myFifo = "/tmp/myfilo";
   char* inbuf;
   mkfifo(myFifo, 0666);
   
   while(1){
   int fd=open(myFifo, O_WRONLY);
   gets(inbuf);
   printf("%s",inbuf);
   write(fd, inbuf, msgSize);
   close(fd);
   fd=open(myFifo, O_RDONLY);
   read(fd,inbuf,msgSize);
   close(fd);
   } 
return 0;
}

Podobno brakuje jakiejś zmiennej, do której ten tekst ma się władowywać i z niej ma odczytywać drugi program ale jeśli chodzi o C i linuxa to jestem kompletnie zielony i nie wiem już za co mam się zabrać...

Potrzebowałbym pomocy co mam jeszcze poczytać, najlepiej z jakimś prostym przykładem. No i czy w tych programach jest wszystko dobrze napisane ?

1 odpowiedź

0 głosów
odpowiedź 10 kwietnia 2018 przez Benek Szeryf (93,910 p.)
wybrane 10 kwietnia 2018 przez MrFraxis
 
Najlepsza

Nie jestem pewien, czy nie podszedłem do tego zbyt naiwnie, ale u mnie działa. Potoki w Linuxie, to przekierowywanie wyjścia jednego programu (to co program produkuje) na wejście innego programu. Działa to mniej więcej tak:

program1 --> wynik1
program2(wynik1) --> wynik2

a skrótowo możemy to zapisać:

program1 | program2

I otrzymamy na wyjściu wynik2. Przy okazji nie trzeba się bawić w przekazywanie argumentów (wyników), bo potok zrobi to za nas. Trywialny przykład:

#include<stdio.h>

int main()
{
        printf("7\n");
        return 0;
}

Po uruchomieniu programu otrzymasz w konsoli liczbę 7. Teraz kolejny program:

#include<stdio.h>

int main()
{
        int value;
        scanf("%d", &value);
        printf("value = %d\n", value);
        return 0;
}

Po uruchomieniu czeka on na liczbę całkowitą, a po jej wpisaniu wyświetla value = 4, jeśli podałeś na wejściu 4.

Teraz w terminalu robisz potok:

./program1 | ./program2

I otrzymasz na wyjściu napis value = 7, bo 7 jest zaczerpnięte z pierwszego programu.

komentarz 10 kwietnia 2018 przez MrFraxis Początkujący (390 p.)
No dobra, mniej więcej rozumiem ideę potoków ale problem w tym, że to musi działać pomiędzy dwoma terminalami. Czyli:

W terminalu 1 wpisuję "asdf" i klikam enter

W terminalu 2 ma się to "asdf" pojawić
1
komentarz 10 kwietnia 2018 przez Benek Szeryf (93,910 p.)

Ok, czyli źle Cię zrozumiałem. Wydaje mi się, że to powinno Ci pomóc: www.geeksforgeeks.org/named-pipe-fifo-example-c-program/

komentarz 10 kwietnia 2018 przez MrFraxis Początkujący (390 p.)
Dokładnie o to mi chodziło! Dzięki wielkie :)

Podobne pytania

0 głosów
1 odpowiedź 528 wizyt
+1 głos
1 odpowiedź 1,879 wizyt
pytanie zadane 26 marca 2017 w C i C++ przez kakola3 Początkujący (270 p.)
0 głosów
2 odpowiedzi 1,473 wizyt
pytanie zadane 2 lutego 2017 w C i C++ przez kakola3 Początkujący (270 p.)

93,741 zapytań

142,677 odpowiedzi

323,294 komentarzy

63,325 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...