Nowe posty

Autor Wątek: [execl][pipe] Problemy wywołaniem grep  (Przeczytany 3487 razy)

uzi123

  • Gość
[execl][pipe] Problemy wywołaniem grep
« dnia: 2009-02-04, 17:16:24 »
Witam
Pisze kod w którym chciałbym zaprogramować odpowiednik ps | grep wzor | wc -l
do oprogramowania | chcialem wykorzystać pipe a następnie wywołać exec w odpowiednie wersji. ps wykonuje mi się bez problemów, problem zaczyna się z grep. Po dojściu do wywołanie przez exec grep-a program poprostu stoi. Wygląda jakby czekał na coś. Poniżej jest kod mojego programu (okrojony z rzeczy nie mających na to wpływu). Może ktoś wie jak to rozwiązać, lub jak "standartowo" implementuje się "|" (o ile implementuje się przez pipe itp).

for (i=0;i NR_FU;i++)
{
if (pipe(fd1)==-1 | pipe(fd2)==-1)
{printf ("blad wpipe \\n");}
else
{ switch (pid=fork())
{    case -1:
printf ("error in fork\\n");
break;
    case 0:
        close(1);
        dup(fd2[1]);
        close(0);
        dup(fd1[0]);
        close(fd1[0]);
        close(fd1[1]);
        close(fd2[0]);
        close(fd2[1]);
         sleep (1);
       
        switch (i) {
         case 0:
         execl("/bin/ps","ps","-fx",0);
         printf ("nie wykonalem pierwszego kroku \\n");
         break;        
         case 1:
         execlp("/bin/grep","grep","'TTT'",0);
         printf ("nie wykonalem drugiego kroku  \\n");        
         break;
//i tak dalej........
         }
break;
    default:
        close(fd1[0]);
        close(fd2[1]);        
        switch (i)
        {
        case 0:
        wait(0);
        read(fd2[0],text1,1024);
        printf (text1);
        close(fd1[1]);
        close(fd2[0]);        
        break;
        case 1:
        write(fd1[1],text1,1024);
        close(fd1[1]);        
        wait(0);
        read (fd1[0],text2,1024);        
        close(fd1[0]);        
        printf (text2);        
        break;
//i tak dalej.....

/usr/bin

  • Gość
[execl][pipe] Problemy wywołaniem grep
« Odpowiedź #1 dnia: 2009-04-10, 22:54:39 »
zobacz: man popen

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
[execl][pipe] Problemy wywołaniem grep
« Odpowiedź #2 dnia: 2009-04-11, 12:19:37 »
Nie wiem czy używanie do tego wszystkiego exec() ma sens.

O ile użycie zewnętrznego "ps" jest zrozumiałe, to grepowanie najlepiej rozwiązać samemu (np. za pomocą regexpów), o liczeniu linii nie wspominając.

Możesz też użyć jakiejś biblioteki (np. Qt4), która pozwoli ci skrócić cały program do kilkunastu linijek.