11. interprocess communication

Click here to load reader

Upload: flo

Post on 04-Jan-2016

56 views

Category:

Documents


0 download

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

  • 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