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

Název: Načítání přes rouru pomocí fgets - nerozpozná EOF a proces tak zůstane "viset"
Přispěvatel: 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
Název: Re:Načítání přes rouru pomocí fgets - nerozpozná EOF a proces tak zůstane "viset"
Přispěvatel: Petr Merlin Vaněček 16 Března 2014, 08:01:33
fgets čeká EOL (resp. newline), EOF nebo po daný počet znaků, co kdyby druhý potomek zapisoval po řádcích?
Název: Re:Načítání přes rouru pomocí fgets - nerozpozná EOF a proces tak zůstane "viset"
Přispěvatel: Katsushiro 16 Března 2014, 12:06:23
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?
Název: Re:Načítání přes rouru pomocí fgets - nerozpozná EOF a proces tak zůstane "viset"
Přispěvatel: Petr Merlin Vaněček 16 Března 2014, 12:28:07
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.
Kód: [Vybrat]
find . -iname *test* | grep test

Takže ještě jednou a lépe ... jak to má být?
Název: Re:Načítání přes rouru pomocí fgets - nerozpozná EOF a proces tak zůstane "viset"
Přispěvatel: Katsushiro 16 Března 2014, 12:46:31
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
Název: Re:Načítání přes rouru pomocí fgets - nerozpozná EOF a proces tak zůstane "viset"
Přispěvatel: Petr Merlin Vaněček 16 Března 2014, 13:39:50
http://stackoverflow.com/questions/12080129/how-can-know-if-the-end-of-line-in-c
Název: Re:Načítání přes rouru pomocí fgets - nerozpozná EOF a proces tak zůstane "viset"
Přispěvatel: Yontalcar 18 Března 2014, 00:04:15
Citace: man 7 pipe
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č)