Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2010-10-19 22:44:34

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

fork()+exec() vs popen() - czego użyć do z czytywania wyniku komendy?

Witam wszystkich.

Zastanawiam się czym z czytywać wyniki komend z programu? Obecnie korzystam z popen() w taki oto sposób:

Przykładowa funkcja z mojego pluginu PAVC:

Kod:

int checkDir(char *name)
{
    char command[128];
    memset(command,0,128);

    strcat(command,"ls -aF ");
    strcat(command,getenv("HOME"));
    strcat(command," | grep \\./$ | grep -w ");
    strcat(command,name);

    FILE *pipe;
    if ( !(pipe = (FILE*)popen(command,"r")) )
    {
        perror("Problems with pipe");
        return -1;
    }

    int i=0;
    int c;

    do {
        c = fgetc (pipe);
        if(c!=EOF && c!='\n')
            ++i;
    } while (c != EOF);
    fclose (pipe);

    if(i>0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

Działa to bardzo sprawnie - ale chciałbym zmienić metodę na taką która zamiast popen() będzie korzystać z fork()+exec()+...no właśnie, co tutaj można dać żeby było to zrobione "lepiej"?

Z góry dzięki za info.

Offline

 

#2  2010-10-19 22:55:40

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: fork()+exec() vs popen() - czego użyć do z czytywania wyniku komendy?

skoro dziala to po co zmieniac ... jak juz cos kombinowac to zamiast robic popen/fork lepiej natywnie wylistowac sobie katalog opendir() z dirent.h ...


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#3  2010-10-19 23:02:12

  milyges - inż.

milyges
inż.
Skąd: Gorlice/Kraków
Zarejestrowany: 2006-04-09
Serwis

Re: fork()+exec() vs popen() - czego użyć do z czytywania wyniku komendy?

Jak zostało napisane lepiej opendir()/readdir() + stat

A co do popen, to ono używa fork() execve() w swojej implementacji... Nie ma funkcji systemowej popen ;)

Offline

 

#4  2010-10-19 23:14:50

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: fork()+exec() vs popen() - czego użyć do z czytywania wyniku komendy?

Generalnie może i nie zmieniał bym, ale jak wysłałem zapytanie na listę ALSA-DEV czy plugin w takiej formie mógłby wejść do alsa-lib, to odpowiedź dostałem następującą:

Thanks for the patch.  I looked over this post until now.

The idea is interesting, and I thought of a similar thing before PA
gets popularized, too.

Though, this implementation is a bit too hackish, especially the part
using pipe & co.
  If we have a more simpler and cleaner way for this,
it's worth including to the standard plugin, I think.

Tak więc zastanawiam się jak zrobić to lepiej (funkcji które korzystają z popen() jest całkiem sporo w tym co napisałem i nie wszystkie będą miały swoje odpowiedniki w bibliotekach). Cały patch wraz zkodem do znalezienia chociażby tutaj:

http://www.spinics.net/lists/alsa-devel/msg38896.html

Jestem otwarty na sugestię jak można by zrobić to lepiej... jedno co przychodzi mi do głowy to użycie dup() oraz pipe() tak jak ktoś zrobił to np tutaj:

http://cboard.cprogramming.com/c-programming/120636 … o-output.html

(przy czym u mnie ten przykład nawet poprawiony według sugestii forumowych nie chce działać - znaczy się nic nie zwraca...)

Ale nie mogę znaleźć jakichś działających przykładów - no i nie wiem czy takie rozwiązanie jest realnie lepsze czy gorsze od tego co jest obecnie...

Co o tym sądzicie?

Offline

 

#5  2010-10-20 09:54:18

  milyges - inż.

milyges
inż.
Skąd: Gorlice/Kraków
Zarejestrowany: 2006-04-09
Serwis

Re: fork()+exec() vs popen() - czego użyć do z czytywania wyniku komendy?

Używanie zewnętrznych poleceń typu ls w kodzie C jest.... paskudne i bezsensowne IMO. Jeszcze mi się przypomniało, do listowania katalogów była fajna funkcja scandir.

//EDIT:
No sorry ale jak widze coś takiego:

Kod:

> +    strcat(command3,"echo ");
> +    strcat(command3,pid);
> +    strcat(command3," > ");
> +    strcat(command3,file);

To się nie dziwie że nie chcą tego patcha... fopen()/fprintf()/fclose() ?

//EDIT2:
Czemu zamiast strcat nie używasz np. sprintf() ?

Kod:

sprintf(command3, "echo %d > %s", pid, file);

//EDIT3: O ja pier... za przeproszeniem...
nie wiem czy wiesz ale C ma funkcję mkdir() np. a nie musisz robić system("mkdir");

Offline

 

#6  2010-10-20 20:20:00

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: fork()+exec() vs popen() - czego użyć do z czytywania wyniku komendy?

@milyges:

Niestety to była pierwsza rzecz którą kiedykolwiek napisałem w C (wcześniej to był C++ C++ z QT itp) - stąd taki syf, wiem że pewnie można to zapisać ZNACZNIE ładniej.

O istnieniu scandir() jak i mkdir() nie miałem pojęcia - dzięki za info.

Co do reszty - będę miał chwilkę to przerobię na funkcje które podałeś.

Jedyne pytanie na koniec - co miałeś na myśli tutaj:

To się nie dziwie że nie chcą tego patcha... fopen()/fprintf()/fclose() ?

Offline

 

#7  2010-10-20 22:26:31

  milyges - inż.

milyges
inż.
Skąd: Gorlice/Kraków
Zarejestrowany: 2006-04-09
Serwis

Re: fork()+exec() vs popen() - czego użyć do z czytywania wyniku komendy?

Czemu nie zrobisz fp = fopen(nazwapliku); fprintf(fp, "%d\n", pid); fclose(fp);
Zamiast wywolywać echo pid > plik?

Offline

 

#8  2010-10-20 23:01:57

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: fork()+exec() vs popen() - czego użyć do z czytywania wyniku komendy?

podpowiem jeszcze ze np. ps czyta po prostu zawartosc /proc ... ogolnie jak chesz wywolac cos przez system() / popen() itp to warto sie zastanowic co tak naprawde robi ten program (ew. spojrzes w zrodla ... to jest jedna z zalet free software) i rozwazyc (oczywiscie nie zawsze jest to warte zachodu/celowe) zaimplementowanie tej funkcjonalnosci natywnie

Edit:
jak piszesz fragment czegos warto tez spojrzec czy dana aplikacja nie udostepnia swoich funkcji realizujacych dana operacje ...

Ostatnio edytowany przez bercik (2010-10-20 23:03:03)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)