Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Katsushiro 15 Března 2014, 21:36:36
-
Ahoj všichni! Tentokrát se snažím naučit programovat v Linuxu, resp. kombinace shell + C. Mám prográmek, který by měl vytvořit 2 potomky rodičovského procesu, v jednom potomkovi potom zavolat funkci find a tento výpis poslat do druhého potomka, který by na to měl aplikovat moji vlastní fci grep.
Problém je v tom, že se program neukončuje - pokud mám dobře nastavené waity, myslím, že je problém ve fci grep, resp. přímo v použitém fgets. Ve škole byl sice zadaný, ale myslím si, že to není správně, protože čeká na EOF, ale při čtení dat zaslaných druhým procesem na žádný nenarazí a tak zůstane "viset" a neukončí se.
Snažil jsem se tedy najít nějakou funkci, která funguje jinak, a dostal jsem se k pojmu "asynchronní I/O", který s tímto problémem nejspíše souvisí. Bohužel, z internetu jsem nepochopil, jak se nějaká z těchto nových funkcí používá, a proto bych velmi ocenil, kdyby mi někdo poradil nějaký, úplně nejjednodušší způsob, jak na to :D
Moc díky za všechny rady a tipy, Katsu
P.s.: V případě, že v terminálu spustím find | ./grep ma , tak všechno funguje jak má, program se ukončí a vypíše soubory s názvem obsahujícím "ma". To mě mate - to si to pomocí svislítka nepřeposílá přímo ale vytváří nějaký mezisoubor? :D
Kód je tady: http://codeviewer.org/view/code:3d67
-
fgets čeká EOL (resp. newline), EOF nebo po daný počet znaků, co kdyby druhý potomek zapisoval po řádcích?
-
Musím se přiznat, že jsem tě nepochopil - 2. potomek vyvolává funkci ./grep - ta využívá fgets, který načítá po řádcích, ne?
-
Aha, já myslel, že to máš v tom C programu :)
Ano, využívá fgets, který čeká buď EOL (newline), EOF nebo daný počet znaků.
Takže pokud z toho find předáš na grep, musí skončit po řádce.
find . -iname *test* | grep test
Takže ještě jednou a lépe ... jak to má být?
-
Takže, fór je prostě v tom, že pomocí find v prvním potomkovi něco vypíšu (klidně bez parametru -> úplně všechno). A tenhle výpis předám druhému potomkovi, který by ho měl zpracovat mým vlastním grepem (v tom používám ten fgets). Problém je v tom, že když to testuju v terminálu pomocí výrazu find | .grep ma, tak to vypíše všechno ok a ukončí se, ale když to samé chci udělat v programu ./main, kde využívám roury sám, tak se to neukončí - fgets nepozná konec textu.
Je to trochu pochopitelnější? :D
-
http://stackoverflow.com/questions/12080129/how-can-know-if-the-end-of-line-in-c
-
If all file descriptors referring to the write end of a pipe have been closed, then an attempt to read(2) from the pipe will see end-of-file (read(2) will return 0).
Kdopak má furt otevřený ten filedescriptor? (rodič)