Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Načítání přes rouru pomocí fgets - nerozpozná EOF a proces tak zůstane "viset"  (Přečteno 1882 krát)

Katsushiro

  • Návštěvník
  • Příspěvků: 56
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
« Poslední změna: 15 Března 2014, 23:15:53 od Katsushiro »

Petr Merlin Vaněček

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 5057
    • Lomítkáři
fgets čeká EOL (resp. newline), EOF nebo po daný počet znaků, co kdyby druhý potomek zapisoval po řádcích?
Stiskni CTRL + W ...
80% mozku tvoří kapalina ... u některých brzdová

Katsushiro

  • Návštěvník
  • Příspěvků: 56
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?

Petr Merlin Vaněček

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 5057
    • Lomítkáři
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?
Stiskni CTRL + W ...
80% mozku tvoří kapalina ... u některých brzdová

Katsushiro

  • Návštěvník
  • Příspěvků: 56
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

Petr Merlin Vaněček

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 5057
    • Lomítkáři
Stiskni CTRL + W ...
80% mozku tvoří kapalina ... u některých brzdová

Yontalcar

  • Stálý člen
  • **
  • Příspěvků: 833
  • Semper fidelis
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č)
NB: ASUS X53U - AMD Brazos E450; Debian GNU/Linux Sid amd64 (KDE 4.14)
Jen dvě věci jsou nekonečné - vesmír a lidská hloupost. Tím prvním si ovšem nejsem tak jist. - Albert Einstein

 

Provoz zaštiťuje spolek OpenAlt.