Czyste C, łącza nienazwane, zapis do pliku

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
vodz
Sędziwy Jeż
Sędziwy Jeż
Posty: 59
Rejestracja: 30 paź 2010, 22:24
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Czyste C, łącza nienazwane, zapis do pliku

Post 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.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

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

Post autor: ethanak »

jako stary programista c śmiem zapytać... co ma wspólnego przytoczony kod z twoim problemem?
vodz
Sędziwy Jeż
Sędziwy Jeż
Posty: 59
Rejestracja: 30 paź 2010, 22:24
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

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

Post 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
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

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

Post 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? ;)
vodz
Sędziwy Jeż
Sędziwy Jeż
Posty: 59
Rejestracja: 30 paź 2010, 22:24
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

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

Post 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;
}
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

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

Post 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"?
vodz
Sędziwy Jeż
Sędziwy Jeż
Posty: 59
Rejestracja: 30 paź 2010, 22:24
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

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

Post 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:
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

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

Post 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ć.
vodz
Sędziwy Jeż
Sędziwy Jeż
Posty: 59
Rejestracja: 30 paź 2010, 22:24
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

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

Post autor: vodz »

Tak poradzę sobie. Obecnie przygniata mnie gorszy problem. Słownik ang. polski na drzewach BST brrr.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 15 gości