Master program creates SHM.
| Master program (creates SHM) | function |
|---|---|
shmid = shmget(IPC_PRIVATE, size, flags) |
creating shared memory region |
shm = (int*) shmat(shmid, NULL, 0) |
attach shared memory to this process |
while (shm[0] == 0) {...} |
shm[0] equals 1 if ready, 0 if not. |
shmdt( (char*) shm ) |
detaches memory |
shmctl( shmid, IPC_RMID, 0 ) |
IPC_RMID marks for destroying after last process detached |
Slave program attaches to SHM.
| Slave program | function |
|---|---|
scanf("%d", &shmid) |
shmid passed from master to slave |
shm = shmat(...) |
attach |
shm[0] = 1 |
informs master of completion |
shmdt((char*) shm) |
detach |
send(P2, msg) and receive(P1, msg)send(MB, msg) and receive(MB, msg)Q: What if you’re trying to receive a message but the sender hasn’t sent yet?
A: 2 methods of synchronization:
Sender doesn’t block unless buffer is full. Unless the sender requires an acknowledgement.
|Connects stdout of Process A to the WRITE end of the of the pipe, which passes on to the READ end of the pipe to stdin of Process B. Note it is FIFO.
Is a circular bounded byte buffer. Writers wait when buffer is full, readers wait when buffer is empty.
Its syscall in C is pipe(args[2]), where args[0] is the READ end and args[1] is the WRITE end.
// parent
close(pipeFd[READ_END]);
write(pipeFd[WRITE_END], str, strlen(str) + 1);
close(pipeFd[WRITE_END]);
//child
close(pipeFd[WRITE_END]);
read(pipeFd[READ_END], buf, sizeof(buf));
close(pipeFd[READ_END]);
Possible to change/attach the std__ communication channels to any one of the pipe ends.
void sigint_handler(int signum) must be defined in your program to replace the default signal handling. (requires signal.h)if (signal(SIGINT, sigkill_handler) == NULL) the sigkill handler cannot be registered (cannot replace the default signal kill handling)