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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
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:
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
skoro dziala to po co zmieniac ... jak juz cos kombinowac to zamiast robic popen/fork lepiej natywnie wylistowac sobie katalog opendir() z dirent.h ...
Offline
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
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
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:
> + 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() ?
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
@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
Czemu nie zrobisz fp = fopen(nazwapliku); fprintf(fp, "%d\n", pid); fclose(fp);
Zamiast wywolywać echo pid > plik?
Offline
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)
Offline
Strony: 1