Portál AbcLinuxu, 18. dubna 2024 20:29


Dotaz: Implementace roury v C

17.7.2013 09:04 k-barter_CZ | skóre: 2 | Zlín
Implementace roury v C
Přečteno: 569×
Odpovědět | Admin
Zdravím,

napsal jsem si program, který je schopen číst argumenty přes příkaz řádku a umí rozpoznat, zda je vstup soubor či uzávorkovaný text.

Nyní jsem ve fázi, kdy bych chtěl naimplementovat pajpu ( | ). Googloval jsem asi 3 dny a tady je link, kde bych se mohl chytit:

http://snap.nlc.dcccd.edu/learn/fuller3/chap11/chap11.html

na ABC jsem taky něco našel, konkrétně http://www.abclinuxu.cz/poradna/programovani/show/373050

Našel jsem toho vícero, ale některé workaroundy mi přišly komplikované..

Potíž je v tom, že jako amatérský programátor o implementaci roury nic nevím, nicmnéně vím, jak roura funguje v systému (stdout programu A -> stdin programu B). Zkoušel jsem to na svém programu, nicméně můj program se chová, jako by žádný argument na příkazové řádce nedostal.

Jak už jsem řekl, program je ve stádiu kdy dokáže přijmout soubor (otevře a přečtě), nebo uzávorkovaný text a výsledek hodí na terminál, pokud nepřesměruji do souboru, nebo rourou do jiného programu (což funguje). V tomto případě mi jde o přímý vstup textu, pokud to nepůjde, nic se neděje, jen budu muset dělat soubory, což je záležitost jednoho > , potažmo >> .

Na závěr dodám, že se řídím standardními int main(int argc a char* argv[]), poté z argv kopiruje do pole a potom podle toho buď čte přímo, nebo otevře soubor.


Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

17.7.2013 09:40 potato
Rozbalit Rozbalit vše Re: Implementace roury v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Asi nerozumím otázce, ale programy normálně neimplementují rouru (dokonce ani nevědí, že se v rouře nacházejí). Je to konstrukce shellu, takže shell programům v rouře nastaví stdin/stdout, aby si vstupy a výstupy pěkně předávaly.

Tedy implementovat rouru znamená, že chceš udělat totěž co dělá shell: spustit dva jiné procesy a nastavit jim stdin a stdout tak, aby výstup jednoho šel na vstup druhého. Tohle je v těch odkazovaných příkladech ukázáno a moc jednodušeji se to udělat nedá.

Pokud chceš dělat něco jiného (nevidím tu totiž ani slovo o spouštění dalších procesů), tak zkus víc popsat, o co se vlastně snažíš.
17.7.2013 10:31 Zadejte vaše jméno
Rozbalit Rozbalit vše Re: Implementace roury v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jak si napsal, | posila data do stdin, ne do argv, musis teda cist z tama... A nebo pouzivat neco jako echo file |xargs tvujprogram
17.7.2013 13:09 k-barter_CZ | skóre: 2 | Zlín
Rozbalit Rozbalit vše Re: Implementace roury v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zdravím,

Ano, chci aby můj program bral obsah roury, napr echo "text" | program , pričemž program se tváří, že na vstupu jako argument nic nedostal, ale když zadám program "soubor nebo text", tak už se něco děje.

Nicméně qrencode, CL utilita na generaci QR kódů, to vezme bez jakýkoliv potíží. Nicméně qrencode je v jiném jazyku, můj program je čisté C.

Nicméně děkuji za Vaše tipy, zkusím si odkazy projít ještě jednou. Abych byl upřímný, mě ty postupy přijdou pro mě osobně "psycho". Možná jsem jen něco špatně pochopil nebo mám špatnou představivost.
17.7.2013 13:19 R
Rozbalit Rozbalit vše Re: Implementace roury v C
Nechapes zaklady. Citaj zo standardneho vstupu (stdin)!
18.7.2013 00:09 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Implementace roury v C
Chyba je v představě, že když napíšete "aaa | bbb", tak příkaz aaa dostane svislou čáru jako parametr. Tu ale ve skutečnosti interpretuje už shell a program má rovnou rouru otevřenou pro zápis jako deskriptor 1, tj. standardní výstup. Druhý program má pak tutéž rouru otevřenou pro čtení coby deskriptor 0, tj. standardní vstup. Programy samotné pak skutečnost, že jsou spuštěny přes rouru, vůbec nezajímá a chovají se stejně, jako kdybyste je spustil samostatně (až na výjimky, např. některé programy mají mírně odlišný výstup podle toho, jestli je výstupem terminál nebo ne).
stativ avatar 17.7.2013 14:28 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: Implementace roury v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jak už ostatní psali, pro vstup z roury se použije čtení ze stdin. Ve vašem případě (pokud to dobře chápu) chcete dosáhnout toho, že program bude moct číst argumenty z roury, nebo z argumentů příkazového řádku.

Na to je potřeba rozlišit, jestli má terminál, nebo ne. Na to je funkce isatty(). Pokud terminál má, argumenty budete číst z (char **argv) (tj. parametru main), pokud ne, vstup je z roury a je potřeba číst ze stdin.

V praxi by to vypadalo zhruba následovně (kód není funkční, je to jen ukázka):
char* argument;

if (isatty(STDIN_FILENO)) {
  argument = argv[1];
} else {
  argument = // read_from_stdin
}
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.