Strona 1 z 1

Czyste C, łącza nienazwane, zapis do pliku

: 29 sty 2013, 17:38
autor: vodz
Panowie/Panie problem jest następujący. Potrzebuję umieścić w pliku tekstowym, zawartość katalogu, w jakim się znajduję. Muszę wykonać, to za pomocą łącza nienazwanego (pipe), pomiędzy dwoma procesami.

Proces macierzysty czyta listę katalogów i wysyła informację łączem nienazwanym

Proces potomny czyta listę katalogów z łącza nienazwanego i zapisuje ją do pliku.

KOD:

Kod: Zaznacz cały

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

main() {
   int pdesk[2];
   pipe(pdesk);
   switch(fork()){
      case 0: // proces potomny
	    close(pdesk[1]);
                 dup2(pdesk[0],0);
                 execlp("tr", "tr", "a-z", "A-Z", 0);
                 exit(1);

      default: { // proces macierzysty 
              close(pdesk[0]);
                int file= open("plik",O_CREAT,O_WRONLY,0666);
            	 dup2(pdesk[1],1);
	 dup2(pdesk[1],file);	 
              exit(1);
              }
   }
return 0;
}
Czy ktoś może, mi przedstawić rozwiązanie problemu, które działa? Pojęcia nie mam jak przekierować standardowe wyjście z rury bezpośrednio do pliku tekstowego.

Re: Czyste C, łącza nienazwane, zapis do pliku

: 29 sty 2013, 18:18
autor: ethanak
jako stary programista c śmiem zapytać... co ma wspólnego przytoczony kod z twoim problemem?

Re: Czyste C, łącza nienazwane, zapis do pliku

: 29 sty 2013, 20:25
autor: vodz
ethanak pisze:jako stary programista c śmiem zapytać... co ma wspólnego przytoczony kod z twoim problemem?
Zapewne to, iż nie rozumiem działania pipów na tyle by spowodować przesłanie zawartości katalogu w jakim się znajduję, do pliku. Jeżeli jesteś starym programistą zapewne widzisz, że sobie nie radzę i prosiłem o pomoc. Bowiem ja fachowcem nie jestem. Stąd też moje zapytanie.

Program ma realizować na łączu nienazwanym operację:

Napisz program realizujący następujące wywołanie:
ls -al | tr a-z A-Z > a.txt

Re: Czyste C, łącza nienazwane, zapis do pliku

: 30 sty 2013, 09:19
autor: ethanak
Tu masz wyjaśnione z przykładem: http://stackoverflow.com/questions/4812 ... pipes-in-c
Pierwszy wynik w googlu pod hasłem "pipe fork example" - czy ja wspominałem o pietruszce? ;)

Re: Czyste C, łącza nienazwane, zapis do pliku

: 30 sty 2013, 19:24
autor: vodz
ethanak pisze:Tu masz wyjaśnione z przykładem: http://stackoverflow.com/questions/4812 ... pipes-in-c
Pierwszy wynik w googlu pod hasłem "pipe fork example" - czy ja wspominałem o pietruszce? ;)
Hm fakt generujesz migiem wyniki poprawne zapytań :) , używałem innego zapytania. Ja poradziłem sobie z tym tak:

Kod: Zaznacz cały

  GNU nano 2.2.6                                   Plik: gotowyodczytzapis.c                                                                                 

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
int pdesc[2];

    pipe(pdesc);

    int z = fork();

    if (z == 0) 
{ // dziecko
        dup2(pdesc[1],1); // zamiana std. wyjscia na wyjscie rury
        close(pdesc[0]); //zamykanie zbednego wejscia
        execlp("ls", "ls", "-l", "-a", NULL); 
}
    else
{//rodzic
        int plik = open("wreszcie.txt", O_WRONLY|O_CREAT|O_TRUNC, 0644);
        dup2(pdesc[0], 0); // wejscie std. na wejscie rury
        dup2(plik, 1); // zamien wyjscie na strumien do pliku
        close(pdesc[1]);  //zamknij wejscie
        close(plik);      //zamknij plik
        execlp("tr", "tr", "a-z", "A-Z", NULL);
}
return 0;
}

Re: Czyste C, łącza nienazwane, zapis do pliku

: 31 sty 2013, 06:28
autor: ethanak
Dwa drobne błędy.
1) fork może zwrócić wartość ujemną (sprawdź co to oznacza i napisz odpowiednią reakcję)
2) nie ma gwarancji że execXX nie wróci. Dlaczego wtedy chcesz kończyć program ze statusem wyjścia "prawidłowy"?

Re: Czyste C, łącza nienazwane, zapis do pliku

: 31 sty 2013, 20:46
autor: vodz
ethanak pisze:Dwa drobne błędy.
1) fork może zwrócić wartość ujemną (sprawdź co to oznacza i napisz odpowiednią reakcję)
2) nie ma gwarancji że execXX nie wróci. Dlaczego wtedy chcesz kończyć program ze statusem wyjścia "prawidłowy"?
Rozumiem, że chodzi Ci o obsługę błędów....widać fachowiec, każda reakcja programu musi być uwzględniana :mrgreen:

Re: Czyste C, łącza nienazwane, zapis do pliku

: 01 lut 2013, 09:27
autor: ethanak
Rozumiem że wiesz jak to zrobić?
Bo dobrym zwyczajem (w C) jest umieszczenie exit(1) zaraz za wywołaniem execXX() - raz że program się staje bardziej czytelny, dwa że w przypadku jakiejś modyfikacji kodu nie okaże się, że po nieudanym execu program chce jeszcze coś robić.

Re: Czyste C, łącza nienazwane, zapis do pliku

: 01 lut 2013, 23:07
autor: vodz
Tak poradzę sobie. Obecnie przygniata mnie gorszy problem. Słownik ang. polski na drzewach BST brrr.