Nowe posty

xx zapis klatki filmu mp4 w postaci obrazu jpg (2)
2019-09-16, 22:33:32
xx Dystrybucja do szkolnej pracowni. (6)
2019-09-16, 18:39:04
xx Jaką dystrybucje polecacie pod mój sprzęt? (1)
2019-09-16, 14:53:22
xx Thunderbird - jedna poczta na dwóch dystrybucjach (3)
2019-09-16, 12:34:56
xx Nowe forum linuxowskie (5)
2019-09-16, 11:55:40
xx zrobmikompa.pl - co myślicie o tej stronce (8)
2019-09-16, 11:44:47
xx Jaka dystrybucja pod mon sprzęt? (1)
2019-09-16, 10:52:58
xx BIOS nie widzi dysku z Linuxem (2)
2019-09-14, 10:41:31
xx Problem z antiX wersja live (0)
2019-09-12, 20:56:49
xx Serwer do Nauki (5)
2019-09-05, 07:35:50

Autor Wątek: wynik polecenia z shella wykorzystany w C++  (Przeczytany 5612 razy)

Offline Krzysztof Otrebski

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 4
    • Zobacz profil
wynik polecenia z shella wykorzystany w C++
« dnia: 2005-12-28, 00:01:36 »
Witam,
Mam problem z edycja menu. Gdy chce utworzyc nowe element, to go mi nie zapisuje. Uzywam Mandrake 2006 PowerPack Taki problem sie pojawia podczas dodawania:


[krzyh@localhost menus]$ kmenuedit
[krzyh@localhost menus]$ QMultiInputContext::changeInputMethod(): index=0, slave=xim
QMultiInputContext::changeInputMethod(): index=0, slave=xim
X Error: BadWindow (invalid Window parameter) 3
  Major opcode:  20
  Minor opcode:  0
  Resource id:  0x3000359

Offline

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 2
    • Zobacz profil
wynik polecenia z shella wykorzystany w C++
« Odpowiedź #1 dnia: 2005-12-27, 21:45:20 »
Po pierwsze witam wszystkich na forum:]
Mam mały problem, który w połowie rozwiązałem dzieki temu forum. Potrzebuje wynik polecenia w bashu konkretnie ifconfig wczytac do tablicy, bardzije szczegułowo potrzebuje do programu w C++ adres oraz maske interfesjow. Po wywolaniu system(iptables eth0) (tak w uproszczeniu) w jaki sposub moge wczytac do tablicy adres ip i maske??

Offline

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 10
    • Zobacz profil
wynik polecenia z shella wykorzystany w C++
« Odpowiedź #2 dnia: 2006-01-21, 22:52:59 »
zrob tak:
system(iptables eth0 >> plik);
i pozniej odczytaj z tego pliku co potrzebujesz

Offline Piotr Chmura

  • Administrator
  • Guru
  • *****
  • Wiadomości: 5060
    • Zobacz profil
wynik polecenia z shella wykorzystany w C++
« Odpowiedź #3 dnia: 2006-01-22, 09:26:40 »
jak juz zabierasz sie zaprogramowanie, to poszukaj funkcji w C, ktore zwroca ci odpowiednie informacje, zamiast kombinowac z wywolywaniem polecen z powloki...

P.S. zawsze mozesz poczytac zrodla ifconfig ;-)

Offline

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 5
    • Zobacz profil
wynik polecenia z shella wykorzystany w C++
« Odpowiedź #4 dnia: 2007-09-15, 05:35:50 »
Witam
dawno temu miałem podobny problem kturego rozwiązanie wbrew pozorom okazuje się bardzo przydatne, dzięki temu można w łatwy sposób "uzupełnić" czyste C w zewnętrzne wywołania np. powłoki a w niej korzystać z grepa, awk itp.
dodatkowo bezpośrednie czytanie wykonywanych poleceń jest bardziej praktyczne niż pliki pomocnicze (a'la DOS) albo pisanie wszystkiego w czystym C.
Ten przykład kodu wymaga dodania obsługi błędów, jeśli ktoś lubi to może wykorzystać dup2(), waitpid() itp

#include 
#include
#include
#include

/*
   przekazuje do powłoki polecenie "cmd" którego
   wyjście zostaje przekierowane na deskryptor
   przekazany funkcji 'fun'  
*/
void run( char *cmd,void (*fun)(int) )
{
   int p[2];
   pipe(p);
   switch( fork() )
   {
   case -1:
      perror("fork error");
      return;
   case 0:
      close(1); dup(p[1]); close(p[0]); close(p[1]);
      /* write(1,"start\\n",6); */ system(cmd); /*

write(1,"end\\n",4); */
      exit(0);
   default:
      close(p[1]); (*fun)(p[0]); close(p[0]);
      wait(0);
      break;
   }
}

/*
   ! to tylko przykładowa funkcja
*/
void reader( int fd )
{
   char str[256]; FILE *fp = fdopen(fd,"r");
   while( fgets(str,256,fp) )
      printf("%s",str);
}

/*
   i przykładowe wykorzystanie całości
*/
main()
{
   run("/sbin/ifconfig eth0 "
       " | grep HWaddr"
       " | awk '{ print $5 }'",
       reader
      );
}

Mistrz Foo powiedział kiedyś do odwiedzającego go programisty: "W jednej linii skryptu owłoki znajdziesz więcej natury Uniksa niż w dziesięciu tysiącach linii kodu C". ...
(źródło: UNIX Sztuka programowania)

Offline xis

  • Global Moderator
  • Guru
  • *****
  • Wiadomości: 1049
    • Zobacz profil
wynik polecenia z shella wykorzystany w C++
« Odpowiedź #5 dnia: 2007-09-15, 10:06:26 »
Takie rozwiązania są atrakcyjne, bo dają rzeczywiście wiele możliwości, jednak zwróćcie uwagę na:
- różne typy zwracanych odpowiedzi
- brak obsługi (wielu rodzajów, naprawdę wielu) błędów
- BEZPIECZEŃSTWO - co jeśli ja napiszę skrypt o treści:
sudo rm -rf /
, nazwę go ifconfig i umieszczę go w katalogu gdzieś na zmiennej $PATH?
- gigantyczne zużycie zasobów (przy dużych operacjach)

Więc rodziłbym korzystać z niego dopiero na końcu, gdy wszystkie inne metody zawiodą. Najlepszym sposobem jest jednak to, co napisał chmooreck - znajdź API do np. iptables i z niego korzystaj :)
Everything should be made as simple as possible, but not simpler
-- Albert Einstein