11. Interprocess Communication

Click here to load reader

download 11. Interprocess Communication

of 51

description

11. Interprocess Communication. The Design of The Unix Operating System, Maurice J. Bach. Contents. 11.1 Process Tracing 11.2 System V IPC 11.2.1 Messages 11.2.2 Shared Memory 11.2.3 Semaphores 11.2.4 General Comments 11.3 Network Communications 11.4 Sockets. - PowerPoint PPT Presentation

Transcript of 11. Interprocess Communication

  • 11. Interprocess CommunicationThe Design of The Unix Operating System, Maurice J. Bach

  • Contents11.1 Process Tracing11.2 System V IPC11.2.1 Messages11.2.2 Shared Memory11.2.3 Semaphores11.2.4 General Comments11.3 Network Communications11.4 Sockets

  • 11.1 Process TracingUNIX , . .

  • Ptrace ptrace (cmd, pid, addr, data); cmd : , , pid : id addr : data :

  • ptrace . . ptrace , .Setuid .

  • Killian /proc ; PID /proc . ptrace 3 . . .

  • 11.2 System V IPCUNIX V IPC . : . : . : .

  • , . , . get , .

  • IPC , : = modulo ( ) IPC (permissions structure) . . control , , set , .

  • 11.2.1 Messages .msgget : ( .)msgctl : , .msgsnd : .msgrcv : .

  • Msgget (syntax)msgqid = msgget (key, flag);msgqid : key : flag : ,

  • (queue) , msgqid . IPC . ID msgsnd, msgrcv, msgctl

  • Msgsnd msgsnd (msgqid, msg, count, flag)msgqid : msgget msg : (integer type) count : flag : (action)

  • msgsnd : (1) (2) (3) (4) :

    { , ;while( ) {if( )return;sleep( );} ; ; ; ; , , , ID ; ;}

  • Msgrcv count = msgrcv(id, msg, maxcount, type, flag)id : msg : maxcount : msg type : flag : count :

  • Msgctl msgctl (id, cmd, mstatbuf)id : cmd : mstatbuf : ,

  • #include #include #include #define MSGKEY 75struct msgform { long mtype; char mtext[256]; } msg; int msgid;

    main() { int i, pid, *pint; extern cleanup(); for(i=0; i

  • #include #include #include #define MSGKEY 75 struct msgform { long mtype; char mtext[256]; }; main(){ struct msgform msg; int msgid, pid, *pint; msgid=msgget(MSGKEY, 0777); pid=getpid(); pint=(int *)msg.mtext; *pint=pid; msg.mtype=1; msgsnd(msgid, &msg, sizeof(int), 0); msgrcv(msgid, &msg, 256, pid, 0); printf("client:receive from pid %d\n", *pint); }

  • [root@blue /mydoc]# serverserver:receive from pid 1882server:receive from pid 1883[root@blue /mydoc]# clientclient:receive from pid 1881[root@blue /mydoc]# clientclient:receive from pid 1881

  • 11.2.2 Shared Memory , , . Shmget : (region) , .Shmat : Shmdt : Shmctl :

  • Shmget shmid = shmget(key, size, flag)key, flag : msgget key, flag size : shmid :

  • Shmat virtaddr = shmat (id, addr, flags)id : shmget addr : flags : (read only) , (round off) viraddr : ( addr .)

  • Shmdt shmdt(addr)addr : shmat

  • Shmctl shmctl (id, cmd, shmstatbuf)id : cmd : shmstatbuf : ( )

  • // attach#include #include #include #define SHMKEY 75 #define K 1024 int shmid; main(){ int i, *pint; char *addr1, *addr2; extern char *shmat(); extern cleanup(); for(i=0; i
  • // share#include #include #include #define SHMKEY 75 #define K 1024 int shmid; main(){ int i, *pint; char *addr; extern char *shmat(); shmid=shmget(SHMKEY, 64*K, 0777); addr=shmat(shmid, 0, 0); pint=(int *)addr; while(*pint==0) ; for(i=0; i
  • [root@blue /mydoc]# attach addr1 0x4010b000 addr2 0x4012b000 index 0value 256 index 1value 1 index 2value 2 index 3value 3 [root@blue /mydoc]# shared 256 1 2 3 255

  • 11.2.3 Semaphores (atomically) .UNIX . ID 0

  • semget : semctl : semop :

  • Semget id = semget (key, count, flag)key, flag, id : , count :

  • Semop oldval = semop (id, oplist, count)id : semget oplist : count : oldval : , Oplist

  • Semctl semctl(id, number, cmd, arg)Arg union .Union semunion {int val;struct semid_ds *semstat;unsigned short *array; } arg;id : id number : cmd :

  • 11.2.4 General Comments IPC .Get creat open .control , unlink . close .IPC , (key) .

  • 11.3 Network CommunicationsMail, , . mail mail . mail (agent) . .

  • UNIX , . , .

  • ioctl , ., . V push , , .

  • 11.4 Sockets , , BSD . , , 3 . : . : . : .

  • - , , . , .

  • (naming convention) .4.2 BSD UNIX , DARPA . .

  • .Socket : (end point) .Bind : .Connect : .Listen : .Accept : .Send recv : .Shutdown : .Getsockname : bind .

  • Socket sd = socket(format, type, protocol)format : type : protocol : Bind bind(sd, address, length)sd : address : socket length : address

  • Connect connect(sd, address, length)sd, length : bind address : Listen listen(sd, qlength)sd : qlength :

  • Accept nsd = accept(sd, address, addrlen)sd : address : addrlen : nsd : accept sd

  • Send count = send(sd, msg, length, flags)sd : msg : length : flags : out-of-band SOF_OOB . count :

  • Recv count = recv(sd, buf, length, flags)sd : buf : length : flags : peek , out of band . count :

  • Shutdown Shutdown(sd, mode)sd : mode : , , . Getsockname Getsockname(sd, name, length)

  • // unix.h

    #include #include #include #include

    #define UNIXSTR_PATH "./s.unixstr#define UNIXDG_PATH "./s.unixdg#define UNIXDG_TMP "/tmp/dg.XXXXXX

    char *pname;

  • // socket client#include "unix.h

    main(int argc, char *argv[]){ int sockfd, servlen; struct sockaddr_un serv_addr;

    pname=argv[0];

    bzero((char *)&serv_addr, sizeof(serv_addr)); serv_addr.sun_family = AF_UNIX; strcpy(serv_addr.sun_path, UNIXSTR_PATH); servlen=strlen(serv_addr.sun_path) + sizeof(serv_addr.sun_family);

    if((sockfd=socket(AF_UNIX, SOCK_STREAM, 0)) < 0) printf("client: can't open stream socket"); if(connect(sockfd, (struct sockaddr *)&serv_addr, servlen) < 0) printf("client: can't connect to server"); write(sockfd, "hi guy\0", 7); close(sockfd); exit(0);}

  • // socket server#include "unix.h

    main(int argc, char *argv[]){ int sockfd, newsockfd, clilen, childpid, servlen; struct sockaddr_un cli_addr, serv_addr; char buf[256];

    pname = argv[0];

    if((sockfd=socket(AF_UNIX, SOCK_STREAM, 0)) < 0) printf("server: can't open stream socket"); bzero((char *)&serv_addr, sizeof(serv_addr)); serv_addr.sun_family = AF_UNIX; strcpy(serv_addr.sun_path, UNIXSTR_PATH); servlen=strlen(serv_addr.sun_path) + sizeof(serv_addr.sun_family);

    if(bind(sockfd, (struct sockaddr *)&serv_addr, servlen) < 0) printf("server: can't bind local address"); listen(sockfd, 5);

  • for( ; ; ) { clilen = sizeof(cli_addr); newsockfd=accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);

    if(newsockfd < 0) printf("server: accept error");

    if((childpid=fork()) < 0) printf("server:fork error"); else if (childpid==0) { close(sockfd); read(newsockfd, buf, sizeof(buf)); printf("server read '%s'\n", buf); exit(0); } close(newsockfd); }}

  • root@blue /mydoc]# soc_serverserver read 'hi guy'[root@blue /mydoc]# soc_client