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
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

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.