Č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:
Fórum › C / C++
Pomoc s rourou
pipe search via google.com and wikipedia ;-)
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 ;)
"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.
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??? :-)
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.
Žá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 ...).
co je to ta rura ? :ms_0201:
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.
Č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);
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.
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.
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.
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.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Pomoc.... nějaká chybka prosím pomoc - více v podrobném popisu — založil tkstudent
Pomoc, pomoc s úkolem (matice v Delphi) — založil maxikp
Pomoc — založil Matejko42
Moderátoři diskuze