Download - Inter Process Communication

Transcript
Page 1: Inter Process Communication

Inter Process Communication

Page 2: Inter Process Communication

Introduction

• Traditionally describe mechanism for message passing between different processes that are running on some operating system.

Page 3: Inter Process Communication

IPC• Mechanism for processes to communicate and to

synchronize their actions.• Message system – processes communicate with each

other without resorting to shared variables.• IPC facility provides two operations:

– send(message) – message size fixed (signals) or variable (sockets)

– receive(message)

• If P and Q wish to communicate, they need to:– establish a communication link between them (connection

oriented e.g. TCP/IP, pipe)– exchange messages via send/receive (e.g. UDP/IP)

• Implementation of communication link– physical (e.g., shared memory, hardware bus, network)– logical (e.g., logical properties: FIFO, error free)

Page 4: Inter Process Communication

Direct Communication

• Processes must name each other explicitly:– send (P, message) – send a message to process P– receive(Q, message) – receive a message from

process Q

• Properties of communication link– Links are established automatically. – A link is associated with exactly one pair of

communicating processes. – The link may be unidirectional (e.g. signaling), but is

usually bi-directional (e.g. sockets).

Page 5: Inter Process Communication

Indirect Communication

• Messages are directed and received from mailboxes (also referred to as ports).– Each mailbox has a unique id. (e.g. shared memory,

shared file, message Q)– Processes can communicate only if they share a

mailbox.• Properties of communication link

– A link may be associated with many processes.– Each pair of processes may share several

communication links.– Link may be unidirectional or bi-directional.

Page 6: Inter Process Communication

Indirect Communication

• Operations– create a new mailbox– send and receive messages through mailbox– destroy a mailbox

• Primitives are defined as:send(A, message) – send a message to mailbox Areceive(A, message) – receive a message from mailbox A

Page 7: Inter Process Communication

Synchronization

• Message passing may be either blocking or non-blocking.

• Blocking is considered synchronous • Non-blocking is considered asynchronous • send and receive primitives may be either

blocking or non-blocking.• Buffering: Queue of messages attached to the

link; implemented usually with bounded capacity.finite length of n messages. Sender must wait if link full.

Page 8: Inter Process Communication

Persistence

• Persistence: How long an IPC object of that type remains in existence.– Process persistence IPC (socket)– Kernel persistence IPC (message Q)– File-System persistence IPC (shared file)

Page 9: Inter Process Communication

ExamplesDirect Communication

Page 10: Inter Process Communication

Signals

• The source process can "raise" a signal and have it delivered to destination process. The destination process' signal handler is invoked and the process can handle it.– A direct communication – Unidirectional channel is established automatically.– Processes must name each other explicitly using the

process ID in order to send messages of fixed size.– Asynchronous.– Kernel persistence (e.g. SIGCHILD).

Page 11: Inter Process Communication

Pipes• There is no form of IPC that is simpler than pipes.

– A direct communication in which unidirectional channels are established between “related” processes.

– Basically, a call to the int pipe(int fd[2]) function returns a pair of file descriptors.

– One of these descriptors is connected to the write end of the pipe, and the other is connected to the read end.

– On many systems, pipes will fill up after you write about 10K to them without reading anything out.

Page 12: Inter Process Communication

Example#include <stdio.h>#include <stdlib.h> #include <sys/types.h> #include <unistd.h>

int main() { int pfds[2]; char buf[30]; pipe(pfds); if (fork()==0) {

printf(" CHILD: writing to the pipe\n"); write(pfds[1], "test", 5); //close pfds[0]printf(" CHILD: exiting\n"); exit(0);

} else { printf("PARENT: reading from pipe\n"); read(pfds[0], buf, 5); //close pfds[1]printf("PARENT: read \"%s\"\n", buf); wait(NULL);

} }

Page 13: Inter Process Communication

"ls | wc –l” #include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(void){ int pfds[2]; pipe(pfds); if (!fork()) { close(1); /* close normal stdout */ dup(pfds[1]); /* make stdout same as pfds[1] */ close(pfds[0]); /* we don't need this */ execlp("ls", "ls", NULL); } else { close(0); /* close normal stdin */ dup(pfds[0]); /* make stdin same as pfds[0] */ close(pfds[1]); /* we don't need this */ execlp("wc", "wc", "-l", NULL); } return 0;}

Page 14: Inter Process Communication

FIFO

• A FIFO is sometimes known as a named pipe. That is, it's like a pipe, except that it has a name!

• In this case, the name is that of a file that multiple processes can open and read and write to.

• Has to be open at both ends simultaneously before you can proceed to do any input or output operations on it .

• Would you like to know more? – int mkfifo(const char *path, mode_t mode);

– mkfifo("/tmp/namedpipe" , 0666); – SIGPIPE

Page 15: Inter Process Communication

Producerint main(void){ char s[300]; int num, fd;

mkfifo("/tmp/namedpipe" , 0666); printf("waiting for readers...\n"); fd = open("/tmp/namedpipe", O_WRONLY); //blocked printf("got a reader--type some stuff\n");

while (gets(s), !feof(stdin)) { if ((num = write(fd, s, strlen(s))) == -1) perror("write"); else printf(“producer: wrote %d bytes\n", num); } return 0;}

Page 16: Inter Process Communication

Consumerint main(void){ char s[300]; int num, fd; mkfifo ("/tmp/namedpipe", 0666); printf("waiting for writers...\n"); fd = open("/tmp/namedpipe", O_RDONLY); printf("got a writer\n");

do { if ((num = read(fd, s, 300)) == -1) perror("read"); else { s[num] = '\0'; printf(“consumer: read %d bytes: \"%s\"\n",

num, s); } } while (num > 0);

return 0;}

Page 17: Inter Process Communication

ExamplesIndirect Communication

Page 18: Inter Process Communication

Message Queues• Create:

int msgget(key_t key, int msgflg);

key_t ftok(const char *path, int id);

key = ftok(“somefile", 'b');

msqid = msgget(key, 0666 | IPC_CREAT); • Send

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg =0);

• Receive:

int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

• Destroy:

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

msgctl(msqid, IPC_RMID, NULL);

Page 19: Inter Process Communication

Example#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>

struct my_msgbuf { long mtype; char mtext[200];};

Page 20: Inter Process Communication

Producerint main(void){ struct my_msgbuf buf; int msqid; key_t key; key = ftok("ipc_example.c", 'B'); msqid = msgget(key, 0644 | IPC_CREAT); printf("Enter lines of text, ^D to quit:\n"); buf.mtype = 1;

while(gets(buf.mtext), !feof(stdin)) { msgsnd(msqid, (struct msgbuf *)&buf,

strlen(buf.mtext)+1, 0); } msgctl(msqid, IPC_RMID, NULL); return 0;}

Page 21: Inter Process Communication

Consumerint main(void){ struct my_msgbuf buf; int msqid; key_t key;

key = ftok("ipc_example.c", 'B'); msqid = msgget(key, 0644); for(;;) { msgrcv(msqid, (struct msgbuf *)&buf,

sizeof(buf.mtext), 0, 0); printf("consumer: \"%s\"\n", buf.mtext); } return 0;}

Page 22: Inter Process Communication

Shared Memory Segments• Create:

int shmget(key_t key, size_t size, int shmflg);

key = ftok(“somefile", ‘b');

shmid = shmget(key, 1024, 0644 | IPC_CREAT);• Use:

void *shmat(int shmid, void *shmaddr, int shmflg);

int shmdt(void *shmaddr);• Destroy:

shmctl(shmid, IPC_RMID, NULL);

For synchronization use UNIX semaphores.