cr3us
Moderator
Inregistrat: acum 16 ani
Postari: 160
|
|
Comunicarea între procese folosind mesaje
Cuprins:
1. Despre LINUX …………………………………………………pag. 3
2. Biblioteci incluse………………………………………………..pag. 4
3. Trimiterea mesajelor din linia de comandă……………………..pag. 4
4. Receptionarea mesajelor din linia de comandă…………………pag. 4
5. Apelul functiei msgget………………………………………….pag. 5
6. Codul sursa al programului……………………………………..pag. 6
1. Despre LINUX
Linux este unul dintre cele mai cunoscute exemple de software liber şi dezvoltare de software Open Source. Termenul Linux se refera la nucleul Linux dar este folosit în mod curent pentru a descrie întregul sistem de operare, care conţine nucleul Linux, bibliotecile software şi diverse unelte. O distribuţie Linux adaugă acestor componente de bază o mare cantitate de software organizată în "pachete". Folosirea termenului "Linux" pentru întreg sistemul, deşi foarte răspândită, este contestată de către Free Software Foundation (autorii Proiectului GNU, pe care se bazează o mare parte din distribuţiile Linux). Aceştia propun utilizarea termenului GNU/Linux (se citeşte "GNU şi Linux" sau "Gnu plus Linux" ). Nucleul a fost dezvoltat la început pentru microprocesorul Intel 386 dar acum suporta o mare gamă de microprocesoare şi arhitecturi. Este folosit atât pe calculatoare PC şi supercomputere cât şi pe sisteme încapsulate ca telefoanele mobile sau video recordere. Iniţial dezvoltat şi utilizat de către programatori voluntari, Linux a câştigat suportul industriei IT şi al marilor companii ca IBM şi Hewlett-Packard şi a depăşit ca folosire cele mai multe versiuni proprietare de Unix. Analiştii atribuie succesul sistemului faptului că este independent de furnizor, implementarea are un cost scăzut, securitatea şi fiabilitatea sistemului sunt foarte bune. Dezvoltarea sistemului a fost începută de către Linus Torvalds care dorea să obţină un sistem similar cu Minix, dar fără limitările acestuia. Linux a fost dezvoltat sub licenţa GNU General Public License astfel încât codul sursă este disponibil oricui, şi va rămâne disponibil pe viitor tuturor celor interesaţi.
2. Se includ urmatoarele biblioteci:
#include <unistd.h> // conţine funcţii standard unix ca getpid(), funcţie care ia //id-ul procesului #include <sys/types.h> /* tipuri variate de definiţii ca pid_t #include <sys/ipc.h> #include <sys/msg.h> //directivă ce conţine functiile msgsnd si msgrcv pid_t pid; //găseşte propriul id al procesului cu ajutorul funcţiei getpid()
3. Trimiterea mesajelor din linia de comandă
Trimiterea de mesaje in interiorul proceselor poate fi realizată în linia de comandă (Linux Shell) cu ajutorul comenzii msgsnd.
int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);
Parametri : - msqid - un ID obtinut de un apel msgget - msgp - mesajul de trimis - msgsz - dimensiunea mtext, in octeti (pozitiva) - msgflg - poate fi IPC_NOWAIT
Intoarce msgsz in caz de succes si -1 in caz de eroare. Textul mesajului si tipul sau sunt memorate in structura interna msg. Sunt updatate campurile msg_cbytes, msg_qnum, msg_lspid si msg_stime, iar procesele reader care asteapta la coada de mesaje sunt trezite.
4. Receptionarea mesajelor din linia de comandă
Receptionarea de mesaje in interiorul proceselor poate fi realizată în linia de comandă (Linux Shell) cu ajutorul comenzii msgrcv.
int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);
Parametri : - msqid - un ID obtinut de un apel msgget - msgp - spatiu alocat de user pentru memorarea mesajului - msgsz - dimensiunea maxima a mesajului de primit - msgtyp - un intreg cu valorile : = 0 - ia primul mesaj din coada > 0 - ia primul mesaj din coada din respectivul tip < 0 - ia mesajul din cel mai mic tip <= abs(msgtyp), cautand in toata coada - msgflg IPC_NOWAIT - apelul se termina imediat daca nu este gasit un mesaj MSG_NOERROR - mesajul este trunchiat daca depaseste msgsz MSG_EXCEPT - cu msgtyp > 0, se primesc toate mesajele cu exceptia celui specificat Intoarce lungimea mesajului primit sau -1 in caz de eroare. Daca lungimea mesajului este mai mica decat msgsz sau daca flagul MSG_NOERROR este setat, mesajul si tipul sau sunt copiate in msgp->mtext si msgp->mtype, dupa care mesajul este scos din coada. Sunt updatate campurile msg_cbytes, msg_qnum, msg_lrpid si msg_rtime, iar procesele writer care asteapta la coada de mesaje sunt trezite.
5. Apelul functiei msgget
msqid = msgget(key_t key, int msgflg);
Parametrii au urmatoarea semnificatie : - key - un intreg obtinut de obicei prin ftok() sau IPC_PRIVATE - msgflg IPC_CREAT - creeaza o resursa daca ea nu exista deja IPC_CREAT | IPC_EXCL - daca resursa exista deja, apelul esueaza rwxrwxrwx - permisiuni de acces specificate ca in cazul fisierelor
Apelul intoarce un intreg folosit pentru accesele viitoare sau -1 in caz de insucces. O coada de mesaje noua este alocata daca nu exista o resursa asociata cheii date. In acest caz permisiunile de acces sunt copiate intr-o structura ipc_perm si campurile structurii msqid_ds sunt initializate. Pentru a se asigura ca se aloca o noua instanta, procesul user trebuie sa foloseasca flagul IPC_CREAT sau cheia IPC_PRIVATE. Daca exista o resursa asociata cheii, se verifica permisiunile de acces.
6. Codul sursa al programului:
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>
int msqid; struct msgform { long mtype; int mtext; } msg; main() {int opt; pid_t pid; puts("\nIntroduceti mesajul de transmis:" ); scanf("%d",&opt); msqid= msgget(IPC_PRIVATE, IPC_CREAT | 0644); if(msqid==-1) { puts("Nu se mai poate aloca o noua coada de mesaje!" ); exit(-1); } if (fork()==0) { //proces consumator if(msgrcv(msqid, &msg, 256, 17, !IPC_NOWAIT)== -1) perror("Eroare de primire in functia msgrcv()" ); else printf("Mesajul receptionat de procesul %d are continutul %d\n", getpid(), msg.mtext); exit(0); } else { //proces producator msg.mtype=17; msg.mtext=opt; printf("Mesajul trimis de procesul %d are continutul %d\n", getpid(), msg.mtext); if(msgsnd(msqid, &msg, 256, IPC_NOWAIT)== -1) perror("Eroare de trimitere in functia msgsnd()" ); } }
_______________________________________ Cr3u$
|
|