Pipes
FIFO
Message Queues
Sockets
Forms
half duplex pipes
FIFOs
full duplex pipes
named full duplex pipes
Message Queues
Semaphores
Shared Memory
Sockets
STREAMS
UNIX System IPC
- half duplex
- only common ancestors
Limitations:
#include <unistd.h>
int pipe(int fd[2]);
Creating pipe
Picture
Parent-Child
FILE *popen(const char *cmd,char *type)
popen and plcose
int pclose(FIlE *fp)
filters - program that reads from stdin and writes to stdout
coprocess- filters become co-process if same program generates filter's input and reads filter's output
Creating FIFO:
mkfifo(char *path,mode_t mode)
open- O_BLOCK (default)
O_NONBLOCK
No lseek on FIFO !!
Duplicating output streams
Client/Server Rendezvous points
unrelated process - FIFO
IPC structure (message queues, semaphores and shared memory)commonalities
internally identified using Identifiers, a non negative number. It increases monotonically and finally wraps around
external name for IDs
needs to specified whenever an IPC structure is created
data type - key_t
XSI IPC
struct msqid_ds
{
msg_perm;
msg_qnum;
msg_qbytes;
msg_lspid;
msg_lrpid;
msg_stime;
msg_rtime;
msg_ctime;
}
#include<sys/msg.h>
int msgget(key_t key,int flag)
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
cmd - IPC_STAT, IPC_SET, IPC_RMID
itn msgsnd(int msqid, const void *ptr, size_t nbytes, int flag);
ssize_t msgrcv(int msqid, void *ptr, size_t nb, long type, int flag);
Message Queue
Semaphore
It is not an IPC
It is a counter used to control access to shared resource
Procedure:
1. test semaphore value
2. If value>0 grant access, value--
3. If value=0 sleep until value >0
4. job done, value++
Complicated XSI semaphores
#include<sys/sem.h>
int semget(key_t key, int nsems, int flag)
int semctl(int semid, int semnum, int cmd, ...);
flags- IPC_STAT, IPC_SET, IPC_RMID
GETVAL, SETVAL,
GETPID, SETPID
int semop(int semid, struct sembuf s[], size_t nops)
semop - can be >0, <0,=0
- fastest IPC
- needs synchronization
- provided by Semaphores
allows 2 or more processes to share a given region of memory
struct shmid_ds
{
shm_perm;
shm_segsz;
shm_lpid;
shm_cpid;
shm_nattch;
shm_atime;
shm_dtime;
shm_ctime;
}
Shared Memory
#include<sys/shm.h>
int shmget(key_t key, size_t size, int flag)
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
cmd- IPC_STAT, IPC_SET, IPC_RMID, SHM_LOCK, SHM_UNLOCK
void *shmat(int shmid,const void *addr, int flag)
int shmdt(void *addr)
-using pipes:parent-client, child-server
two pipes required
-using FIFO : server -well known FIFO
client specific FIFO
- using messagq queue:
shared message queue
exclusive message queue
ecurity
Client-server properties
Streams between parent and child
use API: s_pipe(int fd[2]).
Naming Stream pipes:
int fattach(int fd, const char *path)
STREAMS
Functions for unique connections:
1. serv_listen()
2. serv_accept()
3. cli_conn()
Passing File Descriptors
-one process opens file and passes descriptors to another
send_fd(int fd, int fd_to_send)
send_err(int fd, int status , char *erro)
recv_fd(int fd, functionpointer)
open server - server dedicated for opening of file or device and handing over file descriptor to client
Advantages
- less IPC data exchanged between client and server
-easy to modify as change at single place
- security
Protocol:
- client sends request for a file or device
- server returns with file descriptor or error
1. not a single value, rather set of values
2. creation and initialization seperate
3. can lead to garbages
struct sem_ds
{
sem_perm;
sem_nsems;
sem_otime;
sem_ctime;
}
binary semaphore
related process pipes