Pomoc s rourou – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pomoc s rourou – C / C++ – Fórum – Programujte.comPomoc s rourou – C / C++ – Fórum – Programujte.com

 

gallardo0
Duch
21. 1. 2007   #1
-
0
-

Čauves všem, potřeboval bych moc moc pomoc s kódem na pojmenovanou rouru. Nevíte někdo jak se píše? Děkuju moc všem co se ozvou :ms_0017:

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
21. 1. 2007   #2
-
0
-

pipe search via google.com and wikipedia ;-)

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
sn3d0
Věrný člen
22. 1. 2007   #3
-
0
-

Takze na vytvorenie pomenovanej rury mozes pouzit fcie mkfifo() a mknod() (radsej tu mkfifo() http://www.opengroup.org/onlinepubs/009695399/functions/mkfifo.html). Potom nasledne mozes s rurou pracovat ako z beznym suborom.Su tam vsak obmedzenia:

-Ruru mozes otvorit bud len na citanie alebo len na zapis.Ak potrebujes urobit obojstrannu komunikaciu vytvor si na to dve rury.

-Pri funkcii open() odporucam pozriet na O_NONBLOCK.Ide o flag ktore sa pouziva pri pomenovanych rurach.Konkretne ide o to ci sa ma open() funkcia zaseknut alebo pokracovat.Modelova situacia:Predstav si ze ides otvorit ruru na citanie ale rura nieje otvorena na zapis(ziaden iny proces ju nema otvorenu na zapis).Ak pouzijes len O_RDONLY, open sa zasekne pokial ruru neotvory iny proces na zapis.Kombinacia O_RDONLY | O_NONBLOCK toto zablokovanie zrusi a open otvory ruru v pohode.

-Do rury moze byt zapisane len urcite mnozstvo dat (definovane je ako PIPE_BUF)


To zacatecnik:Skusal som daj hladat slovo pipe a naslo kopu blbosti.Jemu ide specialne o pomenovane rury ktore sa oznacuju ako FIFO pipes.Nieje rura ako rura :)

P.S: Inac na to je super knizka Linux - Zaciname programovat. Tam je super vsetko popisane.Od pisania makefileov, debugovanie a verzovanie cez nacitavanie suborov, nCurses, rury,medziprocesorovu komunikaciu, vlakna, sockety az po vyvoj ovladacov.Sice starsia knizka ale DOPORUCUJEM ;)

Nahlásit jako SPAM
IP: ...–
shutdown -h now
DavesMan
~ Anonymní uživatel
26 příspěvků
22. 1. 2007   #4
-
0
-

"Jemu ide specialne o pomenovane rury ktore sa oznacuju ako FIFO pipes."
Pojmenované roury = named pipes. Jasně definovaný a běžně používaný termín. Google najde hafo informací. Např.: http://en.wikipedia.org/wiki/Named_pipe - popsáno pro Linux i Windows.
Pokud ji potřebuješ vytvořit z programu, tak se dá použít např. CreateNamedPipe (http://msdn2.microsoft.com/en-us/library/aa365150.aspx) z Windows API.

Nahlásit jako SPAM
IP: ...–
gallardo0
Duch
22. 1. 2007   #5
-
0
-

Díky moc nejsem z toho moc moudrý, ale pokusím se to nějak nabastlit, sem začátečník :-) Hele jak bych s rourou mohl řešit problém producent konzument? Aby to do ní producent cpal a konzument vybíral? za použítí nějákeho příkazu select??? :-)

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
22. 1. 2007   #6
-
0
-

To DavesMan: Nojo, ja to poznam zase pod pojmom FIFO pipes.Ale pochybujem ze pomocou pipes v google by sa lahko dopatral k tomu co potrebuje vediet.Tym som chcel povedat ze to bola trochu dost odveci rada napisat do googla "pipes".

No prave ma napadlo ze ci to chces pre Windoze alebo podla POSIXu(cize UNIXovske systemy)?

Ano da sa to pouzit na problem producent-konzument.Nepotrebujes ziaden prikaz select(samozrejme hovorim o POSIXovskom pouziti).Co je vlastne pomenovana rura?Je to vlastne subor do ktoreho jeden proces zapisuje a druhy z neho zapisane data cita(zjedndusene povedane).Cize nato ti stacia open() read() a write() funkcie.Neviem ako je to u Win32 takze mozno tam existuju nejake API.



#define PIPE_NAME "tmp/my_pipe"

typedef struct {
....
} data_t;

/////////////////////////////
// KONZUMENT PART
/////////////////////////////
int pipe_fd;
int res;
data_t data;

mkfifo(PIPE_NAME, 0777);
pipe_fd = open(PIPE_NAME, O_RDONLY);
if (pipe_fd < 0) {
printf("error: cannot open pipe\n");
return -1;
}

do {
res = read(pipe_fd, &data, sizeof(data_t));
//spracovanie dat
....
} while (res > 0);

close(pipe_fd);
unlink(PIPE_NAME);


/////////////////////////////
// PRODUCENT PART
/////////////////////////////
int pipe_fd;
int res;
data_t data;

mkfifo(PIPE_NAME, 0777);
pipe_fd = open(PIPE_NAME, O_WRONLY);
if (pipe_fd < 0) {
printf("error: cannot open pipe\n");
return -1;
}

//napnenie data struktury a zapis do rury
data.nieco = ....;
write(pipe_fd, &data, sizeof(data)):

close(pipe_fd);
unlink(PIPE_NAME);



P.S: Mozu byt nepresnosti ale to ma snad niekto opravi.Ale v principe je to asi OK.

Nahlásit jako SPAM
IP: ...–
shutdown -h now
DavesMan
~ Anonymní uživatel
26 příspěvků
22. 1. 2007   #7
-
0
-

Žádný SELECT. Pipe není databáze. Přistupuje se k ní podobně jako k souboru. Producent ji musí vytvořit a zapisiovat do ní data, konzument je z ní bude číst. Producent nesmí do pipe zapsat více (najednou, celkově samozřejmě ano) dat, než je velikost jejího bufferu, tj. konzument si je musí pravidelně "vyzvedávat".
Odkud ty data budou, to záleží samozřejmě na zadání, klidně mohou být z databáze (získaná pomocí SELECT něco FROM ...).

Nahlásit jako SPAM
IP: ...–
gallardo0
Duch
22. 1. 2007   #8
-
0
-

Hele dík moc tohle mi nějak uniklo a práce je fakt peklo. Moc si toho vážím. Díky moc moc zachránili jste mě díky moc jak sn3d tak i DavesMan :-) (ps:ještě že existují i inteligentní lidé.) :-)

Nahlásit jako SPAM
IP: ...–
Radoslav Pala0
Super člen
22. 1. 2007   #9
-
0
-

co je to ta rura ? :ms_0201:

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
22. 1. 2007   #10
-
0
-

No neviem ci to spravne definujem.Rura je sposob ako zabespecit tok dat z jedneho procesu do druheho. Prikladom rury v UNIXoch je presmerovavanie vystupov programov.Napriklad prikaz1 | prikaz2. Potom ide o pomenovane rury ktore sa to rozoberali.Princip je taky ze jeden proces do suboru zapisuje a druhy z neho cita.

Nahlásit jako SPAM
IP: ...–
shutdown -h now
gallardo0
Duch
22. 1. 2007   #11
-
0
-

Čau čau, hele tak jsem to nějak spáchal a vyhlásilo mi to nějakou chybu, nevíte někdo co s tím? Fakt jsem začátečník takže nevím co je tam špatně. Pls poraďte někdo :-( pls dík všem.


#include <stdio.h>

#include <stdlib.h>
#include <time.h>
#define PIPE_NAME "tmp/my_pipe"


typedef struct {

} data_t;

int main(void) {
int i, cislo;
int pole[10];

for(i = 0; i < 10; i++) {
cislo = getNahCis(1, 100);
pole[i] = cislo;
printf("%d. nahodne cislo v rozmezi 1 - 100 je: %d\n", i + 1, cislo);
}

seradPole(pole, i);

for(i = 0; i < 10; i++) {
printf("%d. cislo po serazeni je: %d\n", i + 1, pole[i]);
}

return(0);
}

int getNahCis(int min, int max) {
static int i = 0;
int cislo;

if(i == 0) {
srand(time(NULL));
i = 1;
}

cislo = (rand() % (max - min + 1) + min);

return(cislo);
}
int pipe_fd;
int res;
data_t data;

mkfifo(PIPE_NAME, 0777);
pipe_fd = open(PIPE_NAME, O_RDONLY);
if (pipe_fd < 0) {
printf("error: cannot open pipe\n");
return -1;
}

do {
res = read(pipe_fd, &data, sizeof(data_t));
//spracovanie dat
....
} while (res > 0);

close(pipe_fd);
unlink(PIPE_NAME);


void seradPole(int *pole, int delkaPole) {
int i, j, minIdx, pomoc;

for(i = 0; i < delkaPole - 1; i++) {
minIdx = i;
for(j = i + 1; j < delkaPole; j++) {
if(pole[j] < pole[minIdx]) {
minIdx = j;
}
}
if(i != minIdx) {
pomoc = pole[i];
pole[i] = pole[minIdx];
pole[minIdx] = pomoc;
}
}
}
int pipe_fd;
int res;
data_t data;

mkfifo(PIPE_NAME, 0777);
pipe_fd = open(PIPE_NAME, O_WRONLY);
if (pipe_fd < 0) {
printf("error: cannot open pipe\n");
return -1;
}

//napnenie data struktury a zapis do rury
data.nieco = ....;
write(pipe_fd, &data, sizeof(data)):

close(pipe_fd);
unlink(PIPE_NAME);

Nahlásit jako SPAM
IP: ...–
gallardo0
Duch
22. 1. 2007   #12
-
0
-

Hoj koukal jsem, že tu vedete nějakou výuku C mohl bych se nějak přidat?

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
23. 1. 2007   #13
-
0
-

gallardo píše:#
# Čau čau, hele tak jsem to nějak spáchal a vyhlásilo mi to nějakou chybu, nevíte někdo co s tím? Fakt jsem začátečník takže nevím co je tam špatně. Pls poraďte někdo :-( pls dík všem.



Napis aku presne hlasku ti to vyhodilo, na ktorom riadku a popripade ked ti to padlo tak pri akej kombinacii atd.Urychlis tym odpoved.Lebo takto to musi niekto zobrat skompilovat a sprtat sa v tom a zisti nakoniec ze je to len nejaka trivialna chyba ktorej riesenie by ti hned s fleku povedal.

Nahlásit jako SPAM
IP: ...–
shutdown -h now
gallardo0
Duch
23. 1. 2007   #14
-
0
-

Ahoj, hele takže:-) :
47 C:\Dev-Cpp\main2.c syntax error before string constant
47 C:\Dev-Cpp\main2.c [Warning] data definition has no type or storage class
48 C:\Dev-Cpp\main2.c `O_RDONLY' undeclared here (not in a function)
48 C:\Dev-Cpp\main2.c initializer element is not constant
48 C:\Dev-Cpp\main2.c [Warning] data definition has no type or storage class
49 C:\Dev-Cpp\main2.c syntax error before "if"
60 C:\Dev-Cpp\main2.c [Warning] parameter names (without types) in function declaration
60 C:\Dev-Cpp\main2.c [Warning] data definition has no type or storage class
61 C:\Dev-Cpp\main2.c syntax error before string constant
61 C:\Dev-Cpp\main2.c [Warning] data definition has no type or storage class
64 C:\Dev-Cpp\main2.c conflicting types for 'seradPole'
21 C:\Dev-Cpp\main2.c previous implicit declaration of 'seradPole' was here
85 C:\Dev-Cpp\main2.c syntax error before string constant
85 C:\Dev-Cpp\main2.c [Warning] data definition has no type or storage class
86 C:\Dev-Cpp\main2.c redefinition of 'pipe_fd'
48 C:\Dev-Cpp\main2.c previous definition of 'pipe_fd' was here
86 C:\Dev-Cpp\main2.c `O_WRONLY' undeclared here (not in a function) :ms_0186:
86 C:\Dev-Cpp\main2.c initializer element is not constant
86 C:\Dev-Cpp\main2.c [Warning] data definition has no type or storage class
87 C:\Dev-Cpp\main2.c syntax error before "if"
94 C:\Dev-Cpp\main2.c syntax error before '&' token
97 C:\Dev-Cpp\main2.c syntax error before string constant
97 C:\Dev-Cpp\main2.c [Warning] data definition has no type or storage class
C:\Dev-Cpp\Makefile.win [Build Error] [main2.o] Error 1

Tak tohle vše mi to vyhlásilo asi jsem tam špatně zakomponoval tu pipe.

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
23. 1. 2007   #15
-
0
-

Prva vec: Ty to kompilujes pod windowsom a ja som ti posielal riesenie pre UNIXovske systemy.U Windoze su mensie zmeny.Stale ked sa pytas na taketo veci je potrebne uviest OS pre aky to chces(sice M$ uvadza ze ma implementovane POSIX ale toto je krasna ukazka toho ze M$ kasle na nejaky POSIX).

Dalsia vec:Nieje to ani tym ze je zle implementovana pipe ale ty si doslova chytil ukazkovy kod a pomocou copy paste si ho vlozil do svojho a to bez rozmyslania.Ten kod bol len ukazkovy.Chapem ze si zaciatocnik ale z toho kodu mam pocit ze zrejme ti niesu jasne zaklady ako co je to funkcia, ako ma byt uzavreta,na co su { }, ako sa vykonava kod atd.Skus sa poobzerat po nejakej knizne ktora je uvodom do Cecka alebo si pozri serialy o programovani a prejdi si ich:

http://www.programujte.com/search.php?rsvelikost=sab&rstext=all-phpRS-all&rstema=182&menu5f3be53332d2d4cb4e78b1d815034f83=84:182

Neber to v zlom, ale ten kod je uplne zly, nesplna ani zakladnu poziadavku/ideu producent - konzument.

Nahlásit jako SPAM
IP: ...–
shutdown -h now
gallardo0
Duch
23. 1. 2007   #16
-
0
-

No knihu mám ale tu moc nechápu, ale potřebuji to nutně bohužel naše výuka C probíhá velmi chaoticky, takže to potřebuji mít napsané, abych mohl přijít nakloub tomu co co dělá. :-( Právě, že bych se tu chtěl přihlásit do toho kurzu, neberu to ve zlém. Máš pravdu sprostě jsem to zkopíroval. Pomoc mi pls. Budu se snažit na tom dělat.

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 73 hostů

Podobná vlákna

Pomoc — založil Michael

Pomoc if — založil Priwi

Pomoc — založil Matejko42

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý