Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: Kolejki FIFO  (Przeczytany 4847 razy)

twardziel

  • Gość
Kolejki FIFO
« dnia: 2012-01-10, 19:15:48 »
Teraz ma taki oto program:
Napisz program tworzący dwa procesy: klienta i serwera. Serwer tworzy ogólnodostępną kolejkę FIFO, i czeka na zgłoszenie klientów. Każdy klient tworzy własną kolejkę, poprzez którą będą przychodzić odpowiedzi serwera. Zadaniem klienta jest przesłanie nazwy stworzonej przez niego kolejki, a serwera odesłaniem poprzez kolejkę stworzoną przez klienta wyniku polecenia ls.

A oto mój kod:
#include 
#include
#include
#include

int main()
{
int i, des, des1, id, id1;
//mkfifo("/tmp/serwer", 0600);
char buf[20];

if(fork() == 0)
//SERWER
{

mkfifo("/tmp/serwer", 0600);
des = open("/tmp/serwer", O_RDONLY);
read(des, buf, 12);
printf("serwer: %s\\n", buf);

close(1);
id1 = open("/tmp/klient", O_WRONLY);
execlp("ls", "ls", 0);

exit(0);
}
//klient

char buf1[2000];

des1 = open("/tmp/serwer", O_WRONLY);
        write(des1, "/tmp/klient", 12);

id = open("/tmp/klient", O_RDONLY);
read(id, buf1, 1000);
printf("bufor: %s\\n", buf);

wait(NULL);

//wait(NULL);
return 0;
}
Serwer dobrze odczytuje nazwę kolejki klienta ale kllient nie wyświetla wyniku polecenia ls. W czym problem?

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Kolejki FIFO
« Odpowiedź #1 dnia: 2012-01-10, 19:44:06 »
Musisz przekierować standardowe wyjście do kolejki klienta przed wywołaniem "ls".

Tak:
id1 = open("/tmp/klient", O_WRONLY);
dup2 (id1,1);
execlp("ls", "ls", NULL);
albo tak:
freopen ("/tmp/klient", "wb", stdout);
execlp("ls", "ls", NULL);
wtedy ls prześle wynik ze standardowego wyjścia do kolejki.

Oczywiście najpierw musisz kolejkę klienta utworzyć.

Ksanderon

  • Gość
Kolejki FIFO
« Odpowiedź #2 dnia: 2012-01-10, 20:00:32 »
#include 
#include
#include
#include
#include
#include

int main()
{
    int des, des1, id, id1;
    char buf[20];
   
    if(fork() == 0)
    //SERWER
    {    
       
        mkfifo("/tmp/serwer", 0600);        
        des = open("/tmp/serwer", O_RDONLY);
        read(des, buf, 12);
        printf("serwer: %s\\n", buf);
        close(des);
        close(1);
        id1 = open(buf, O_WRONLY);
        execlp("ls", "ls", 0);
        close(id1);
       
    exit(0);
    }
    //klient
   
    char buf1[2000];

    des1 = open("/tmp/serwer", O_WRONLY);
        write(des1, "/tmp/klient", 12);
close(des1);
    id = open("/tmp/klient", O_RDONLY);
    read(id, buf1, 2000);
    printf("bufor: \\"%s\\"\\n", buf1);
    close(id);
    wait(NULL);
   
return 0;
}
był gdzieś zły deskryptor pisany i warto by czasem pliki zamykać tam dup by się też przydał a tak jak wyżej też będzie "chadzić" chyba ok.

no i ktoś mnie uprzedził:P

1) tak jak nie chce tego robić twardziel(nie wiem czemu),
2) przecież napisałem, że trzeba w odpowiednim miejscu dodać dup'a- pod dodaniu działa.
3) a jak on się powiedzie to zamknie
4) ale w zadaniu wyraźnie jest powiedziane że ma być jeden klient
5) dla tego też zostawiłem tą "istotę problemu" do samodzielnego dopisania. Moim celem nie było podanie gotowego rozwiązania.

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Kolejki FIFO
« Odpowiedź #3 dnia: 2012-01-10, 20:13:42 »
Ksanderon, Twój kod nie ma prawa działać, bo:
1) nigdzie nie tworzysz kolejki klienta,
2) nigdzie nie przekierowujesz wyjścia ls, zamykasz tylko deskryptory,
3) close(id1) wywoła się jedynie w przypadku niepowodzenia execa, bo inaczej proces będzie nadpisany kodem procesu ls,
4) jeżeli serwer ma działać dla wielu klientów, to trzeba dodać jeszcze jednego forka, ewentualnie wywoływać ls przez "system",
5) istotą problemu jest właśnie sposób przekierowania wyjścia komendy do kolejki.

twardziel

  • Gość
Kolejki FIFO
« Odpowiedź #4 dnia: 2012-01-10, 20:36:09 »
Dzięki