Mihai Sprinceana
Un forum de programare cu de toate. Va astept sa va inscrieti si sa deveniti moderatori. Oricine este binevenit aici sa se inscrie si sa aiba acces la informatie free! Fiecare este liber sa adauge proiecte programe free etc. Ajutati acest forum sa devina o comunitate puternica unde fiecare invata de la fiecare! Tot ce trebuie sa faceti este sa va inregistrati si fiecare contributie se poate dovedi utila in timp! Forumul este free informatia free dk aveti timp liber ajutati si pe ceilalti si invatati si voi in acelasi timp! Haideti sa facem ceva pt.a ne ajuta intre noi! Cititi regulament postare forum inainte de a posta!
Lista Forumurilor Pe Tematici
Mihai Sprinceana | Inregistrare | Login

POZE MIHAI SPRINCEANA

Nu sunteti logat.
Nou pe simpatie:
Criscristina92
Femeie
25 ani
Bucuresti
cauta Barbat
29 - 80 ani
Mihai Sprinceana / SO Linux&Unix / Comunicare intre procese prin mesaje(proiect) Moderat de Cristy89, Houssey, cr3us, fireratbat, profu.info, sade5000
Autor
Mesaj Pagini: 1
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$

pus acum 16 ani
   
Miles_Gonzalez
Membru nou

Inregistrat: acum 5 ani
Postari: 2
Thanks for sharing the tips about linux. If you'd like to play Spotify songs on linux, you can follow this best tutorial to get spotify on linux. Sincerely hope this tips help you out.


Modificat de Miles_Gonzalez (acum 5 ani)


pus acum 5 ani
   
Pagini: 1  

Mergi la