Download - 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