An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1....
Transcript of An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1....
![Page 1: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/1.jpg)
1man7.org
Michael Kerrisk © 2013http://man7.org/ [email protected]://lwn.net/[email protected]
An introduction to Linux IPC
linux.conf.au 2013
Canberra, Australia2013-01-30
![Page 2: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/2.jpg)
2man7.org
Goal● Limited time!● Get a flavor of main IPC methods
![Page 3: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/3.jpg)
3man7.org
Me● Programming on UNIX & Linux since 1987 ● Linux man-pages maintainer
● http://www.kernel.org/doc/man-pages/● Kernel + glibc API
● Author of:
Further info:http://man7.org/tlpi/
![Page 4: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/4.jpg)
4man7.org
You● Can read a bit of C● Have a passing familiarity with common syscalls
● fork(), open(), read(), write()
![Page 5: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/5.jpg)
5man7.org
There’s a lot of IPC● Pipes● FIFOs● Pseudoterminals● Sockets
● Stream vs Datagram (vs Seq. packet)
● UNIX vs Internet domain
● POSIX message queues● POSIX shared memory● POSIX semaphores
● Named, Unnamed
● System V message queues● System V shared memory● System V semaphores
● Shared memory mappings● File vs Anonymous
● Cross-memory attach● proc_vm_readv() / proc_vm_writev()
● Signals● Standard, Realtime
● Eventfd● Futexes● Record locks● File locks● Mutexes● Condition variables● Barriers● Read-write locks
![Page 6: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/6.jpg)
6man7.org
It helps to classify● Pipes● FIFOs● Pseudoterminals● Sockets
● Stream vs Datagram (vs Seq. packet)
● UNIX vs Internet domain
● POSIX message queues● POSIX shared memory● POSIX semaphores
● Named, Unnamed
● System V message queues● System V shared memory● System V semaphores
● Shared memory mappings● File vs Anonymous
● Cross-memory attach● proc_vm_readv() / proc_vm_writev()
● Signals● Standard, Realtime
● Eventfd● Futexes● Record locks● File locks● Mutexes● Condition variables● Barriers● Read-write locks
![Page 7: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/7.jpg)
7man7.org
It helps to classify● Pipes● FIFOs● Pseudoterminals● Sockets
● Stream vs Datagram (vs Seq. packet)
● UNIX vs Internet domain
● POSIX message queues● POSIX shared memory● POSIX semaphores
● Named, Unnamed
● System V message queues● System V shared memory● System V semaphores
● Shared memory mappings● File vs Anonymous
● Cross-memory attach● proc_vm_readv() / proc_vm_writev()
● Signals● Standard, Realtime
● Eventfd● Futexes● Record locks● File locks● Mutexes● Condition variables● Barriers● Read-write locks
Communication
SynchronizationSignals
![Page 8: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/8.jpg)
8man7.org
Communication
![Page 9: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/9.jpg)
9man7.org
Synchronizatoin
![Page 10: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/10.jpg)
10man7.org
What we’ll coverYes
Maybe
![Page 11: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/11.jpg)
11man7.org
What we’ll coverYes
Maybe
![Page 12: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/12.jpg)
12man7.org
What is not covered● Signals
● Can be used for communication and sync, but poor for both
● System IPC● Similar in concept to POSIX IPC● But interface is terrible!● Use POSIX IPC instead
● Thread sync primitives● Mutexes, condition vars, barriers, R/W locks● Can use process shared, but rare (and nonportable)
● Futexes● Very low level● Used to implement POSIX sems, mutexes, condvars
● Pseudoterminals
Specialized use cases
![Page 13: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/13.jpg)
13man7.org
Communication techniques
![Page 14: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/14.jpg)
14man7.org
Pipes
![Page 15: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/15.jpg)
15man7.org
Pipes
ls | wc -l
![Page 16: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/16.jpg)
16man7.org
Pipes● Pipe == byte stream buffer in kernel
● Sequential (can’t lseek())● Multiple readers/writers difficult
● Unidirectional● Write end + read end
![Page 17: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/17.jpg)
17man7.org
Creating and using pipe● Created using pipe():
int filedes[1];pipe(filedes);
...
write(filedes[1], buf, count);read(filedes[0], buf, count);
![Page 18: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/18.jpg)
18man7.org
Sharing a pipe● Pipes are anonymous
● No name in file system
● How do two processes share a pipe?
![Page 19: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/19.jpg)
19man7.org
Sharing a pipe
int filedes[2];
pipe(filedes);
child_pid = fork();
fork() duplicates parent’sfile descriptors
![Page 20: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/20.jpg)
20man7.org
Sharing a pipe
int filedes[2];
pipe(filedes);
child_pid = fork();if (child_pid == 0) { close(filedes[1]); /* Child now reads */} else { close(filedes[0]); /* Parent now writes */}
(error checking omitted!)
![Page 21: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/21.jpg)
21man7.org
Closing unused file descriptors● Parent and child must close unused descriptors
● Necessary for correct use of pipes!
● close() write end● read() returns 0 (EOF)
● close() read end● write() fails with EPIPE error + SIGPIPE signal
![Page 22: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/22.jpg)
22man7.org
// http://man7.org/tlpi/code/online/dist/pipes/simple_pipe.c.html
// Create pipe, create child, parent writes argv[1] to pipe, child reads
pipe(pfd); /* Create the pipe */
switch (fork()) {
case 0: /* Child - reads from pipe */
close(pfd[1]); /* Write end is unused */
for (;;) { /* Read data from pipe, echo on stdout */
numRead = read(pfd[0], buf, BUF_SIZE);
if (numRead <= 0) break; /* End-of-file or error */
write(STDOUT_FILENO, buf, numRead);
}
write(STDOUT_FILENO, "\n", 1);
close(pfd[0]);
...
default: /* Parent - writes to pipe */
close(pfd[0]); /* Read end is unused */
write(pfd[1], argv[1], strlen(argv[1]));
close(pfd[1]); /* Child will see EOF */
...
}
![Page 23: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/23.jpg)
23man7.org
I/O on pipes● read() blocks if pipe is empty● write() blocks if pipe is full● Writes <= PIPE_BUF guaranteed to be atomic
● Multiple writers > PIPE_BUF may be interleaved
● POSIX: PIPE_BUF at least 512B
● Linux: PIPE_BUF is 4096B
● Can use dup2() to connect filters via a pipe● http://man7.org/tlpi/code/online/dist/pipes/pipe_ls_wc.c.html
![Page 24: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/24.jpg)
24man7.org
Pipes have limited capacity● Limited capacity
● If pipe fills, write() blocks● Before Linux 2.6.11: 4096 bytes● Since Linux 2.6.11: 65,536 bytes● Apps should be designed not to care about capacity
– But, Linux has fcntl(fd, F_SETPIPE_SZ, size)● (not portable)
![Page 25: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/25.jpg)
25man7.org
FIFOs(named pipes)
![Page 26: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/26.jpg)
26man7.org
FIFO (named pipe)● (Anonymous) pipes can only be used by related
processes● FIFOs == pipe with name in file system● Creation:
● mkfifo(pathname, permissions)
● Any process can open and use FIFO● I/O is same as for pipes
![Page 27: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/27.jpg)
27man7.org
Opening a FIFO● open(pathname, O_RDONLY)
● Open read end
● open(pathname, O_WRONLY)● Open write end
● open() locks until other end is opened● Opens are synchronized● open(pathname, O_RDONLY | O_NONBLOCK) can
be useful
![Page 28: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/28.jpg)
28man7.org
POSIX Message Queues
![Page 29: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/29.jpg)
29man7.org
Highlights of POSIX MQs● Message-oriented communication
● Receiver reads messages one at a time– No partial or multiple message reads
● Unlike pipes, multiple readers/writers can be useful
● Messages have priorities● Delivered in priority order
● Message notification feature
![Page 30: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/30.jpg)
30man7.org
POSIX MQ API● Queue management (analogous to files)
● mq_open(): open/create MQ, set attributes● mq_close(): close MQ ● mq_unlink(): remove MQ pathname
● I/O:● mq_send(): send message● mq_receive(): receive message
● Other:● mq_setattr(), mq_getattr(): set/get MQ attributes● mq_notify(): request notification of msg arrival
![Page 31: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/31.jpg)
31man7.org
Opening a POSIX MQ● mqd = mq_open(name, flags [, mode, &attr]);● Open+create new MQ / open existing MQ● name has form /somename
● Visible in a pseudo-filesystem
● Returns mqd_t, a message queue descriptor● Used by rest of API
![Page 32: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/32.jpg)
32man7.org
Opening a POSIX MQ● mqd = mq_open(name, flags [, mode, &attr]);● flags (analogous to open()):
● O_CREAT – create MQ if it doesn’t exist
● O_EXCL – create MQ exclusively
● O_RDONLY, O_WRONLY, O_RDWR – just like file open
● O_NONBLOCK – non-blocking I/O
● mode sets permissions● &attr: attributes for new MQ
● NULL gives defaults
![Page 33: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/33.jpg)
33man7.org
Opening a POSIX MQ● Examples:
// Create new MQ, exclusive, // for writing mqd = mq_open("/mymq", O_CREAT| O_EXCL | O_WRONLY, 0600, NULL);
// Open existing queue for reading mqd = mq_open("/mymq", O_RDONLY);
![Page 34: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/34.jpg)
34man7.org
Unlink a POSIX MQ● mq_unlink(name);● MQs are reference-counted
● ==> MQ removed only after all users have closed
![Page 35: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/35.jpg)
35man7.org
Nonblocking I/O on POSIX MQs● Message ques have a limited capacity
● Controlled by attributes
● By default:● mq_receive() blocks if no messages in queue● mq_send() blocks if queue is full
● O_NONBLOCK:● EAGAIN error instead of blocking
● Useful for emptying queue without blocking
![Page 36: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/36.jpg)
36man7.org
Sending a message● mq_send(mqd, msg_ptr, msg_len, msgprio);
● mqd – MQ descriptor● msg_ptr – pointer to bytes forming message● msg_len – size of message● msgprio – priority
– non-negative integer– 0 is lowest priority
![Page 37: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/37.jpg)
37man7.org
Sending a message● mq_send(mqd, msg_ptr, msg_len, msgprio);● Example:
mqd_t mqd;mqd = mq_open("/mymq", O_CREAT | O_WRONLY, 0600, NULL);char *msg = "hello world";mq_send(mqd, msg, strlen(msg), 0);
http://man7.org/tlpi/code/online/dist/pmsg/pmsg_send.c.html
![Page 38: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/38.jpg)
38man7.org
Receiving a message● nb = mq_receive(mqd, msg_ptr, msg_len, &prio);
● mqd – MQ descriptor● msg_ptr – points to buffer that receives message● msg_len – size of buffer● &prio – receives priority● nb – returns size of message (bytes)
![Page 39: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/39.jpg)
39man7.org
Receiving a message● nb = mq_receive(mqd, msg_ptr, msg_len, &prio);● Example:
const int BUF_SIZE = 1000;char buf[BUF_SIZE];unsigned int prio;...mqd = mq_open("/mymq", O_RDONLY);nbytes = mq_receive(mqd, buf, BUF_LEN, &prio);
http://man7.org/tlpi/code/online/dist/pmsg/pmsg_receive.c.html
![Page 40: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/40.jpg)
40man7.org
POSIX MQ notifications● mq_notify(mqd, notification);● One process can register to receive notification● Notified when new msg arrives on empty queue
● & only if another process is not doing mq_receive()
● notification says how caller should be notified● Send me a signal● Start a new thread (see mq_notify(3) for example)
● One-shot; must re-enable● Do so before emptying queue!
![Page 41: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/41.jpg)
41man7.org
POSIX MQ attributesstruct mq_attr { long mq_flags; // MQ description flags // 0 or O_NONBLOCK // [mq_getattr(), mq_setattr()] long mq_maxmsg; // Max. # of msgs on queue // [mq_open(), mq_getattr()] long mq_msgsize; // Max. msg size (bytes) // [mq_open(), mq_getattr()] long mq_curmsgs; // # of msgs currently in queue // [mq_getattr()]};
![Page 42: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/42.jpg)
42man7.org
POSIX MQ details● Per-process and system-wide limits govern
resource usage● Can mount filesystem to obtain info on MQs:
● See mq_overview(7)
# mkdir /dev/mqueue# mount -t mqueue none /dev/mqueue# ls /dev/mqueuemymq# cat /dev/mqueue/mymqQSIZE:129 NOTIFY:2 SIGNO:0 NOTIFY_PID:8260
![Page 43: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/43.jpg)
43man7.org
Shared memory
![Page 44: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/44.jpg)
44man7.org
Shared memory● Processes share same physical pages of
memory● Communication == copy data to memory● Efficient; compare
● Data transfer: user space ==> kernel ==> user space● Shared memory: single copy in user space
● But, need to synchronize access...
![Page 45: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/45.jpg)
45man7.org
Shared memory● Processes share
physical pages of memory
![Page 46: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/46.jpg)
46man7.org
Shared memory● We’ll cover three types:
● Shared anonymous mappings– related processes
● Shared file mappings– unrelated processes, backed by file in traditional filesystem
● POSIX shared memory– unrelated processes, without use of traditional filesystem
![Page 47: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/47.jpg)
47man7.org
mmap()● Syscall used in all three shmem types● Rather complex:
● void *mmap(void *daddr, size_t len, int prot, int flags, int fd, off_t offset);
![Page 48: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/48.jpg)
48man7.org
mmap()● addr = mmap(daddr, len, prot, flags, fd, offset);● daddr – choose where to place mapping;
● Best to use NULL, to let kernel choose● len – size of mapping● prot – memory protections (read, write, exec)● flags – control behavior of call
● MAP_SHARED, MAP_ANONYMOUS● fd – file descriptor for file mappings● offset – starting offset for mapping from file● addr – returns address used for mapping
![Page 49: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/49.jpg)
49man7.org
Using shared memory● addr = mmap(daddr, len, prot, flags, fd, offset);
● addr looks just like any C pointer
● But, changes to region seen by all process that map it
![Page 50: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/50.jpg)
50man7.org
Shared anonymous mapping
![Page 51: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/51.jpg)
51man7.org
Shared anonymous mapping● Share memory between related processes● mmap() fd and offset args unneeded
● Allocates zero-initialized block of length bytes● Parent and child share memory at addr:length
● http://man7.org/tlpi/code/online/dist/mmap/anon_mmap.c.html
addr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);pid = fork();
![Page 52: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/52.jpg)
52man7.org
Shared anonymous mapping
addr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);pid = fork();
![Page 53: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/53.jpg)
53man7.org
Shared file mapping
![Page 54: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/54.jpg)
54man7.org
Shared file mapping● Share memory between unrelated processes,
backed by file● fd = open(...); addr = mmap(..., fd, offset);
![Page 55: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/55.jpg)
55man7.org
Shared file mapping● fd = open(...); addr = mmap(..., fd, offset);● Contents of memory initialized from file● Updates to memory automatically carried
through to file (“memory-mapped I/O”)● All processes that map same region of file share
same memory
![Page 56: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/56.jpg)
56man7.org
Shared file mapping
![Page 57: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/57.jpg)
57man7.org
Shared file mapping
fd = open(pathname, O_RDWR);
addr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);...close(fd); /* No longer need 'fd' */
Updates are: visible to other process sharing mapping; and carried through to file
![Page 58: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/58.jpg)
58man7.org
POSIXshared memory
![Page 59: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/59.jpg)
59man7.org
POSIX shared memory● Share memory between unrelated process,
without creating file in (traditional) filesystem● Don’t need to create a file● Avoid file I/O overhead
![Page 60: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/60.jpg)
60man7.org
POSIX SHM API● Object management
● shm_open(): open/create SHM object● mmap(): map SHM object● shm_unlink(): remove SHM object pathname
● Operations on SHM object via fd returned by shm_open():● fstat(): retrieve info (size, ownership, permissions)● ftruncate(): change size● fchown(): fchmod(): change ownership, permissions
![Page 61: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/61.jpg)
61man7.org
Opening a POSIX SHM object● fd = shm_open(name, flags, mode);● Open+create new / open existing SHM object● name has form /somename
● Can be seen in dedicated tmpfs at /dev/shm
● Returns fd, a file descriptor● Used by rest of API
![Page 62: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/62.jpg)
62man7.org
Opening a POSIX SHM object● fd = shm_open(name, flags, mode);● flags (analogous to open()):
● O_CREAT – create SHM if it doesn’t exist
● O_EXCL – create SHM exclusively
● O_RDONLY, O_RDWR – indicates type of access
● O_TRUNC – truncate existing SHM object to zero length
● mode sets permissions● MBZ if O_CREAT not specified
![Page 63: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/63.jpg)
63man7.org
Create and map new SHM object● Create and map a new SHM object of size bytes:
fd = shm_open("/myshm", O_CREAT | O_EXCL | O_RDWR, 0600);
ftruncate(fd, size); // Set size of object
addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
![Page 64: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/64.jpg)
64man7.org
Map existing SHM object● Map an existing SHM object of unknown size:
fd = shm_open("/myshm", O_RDWR, 0); // No O_CREAT
// Use object size as length for mmap()struct stat sb;fstat(fd, &sb);
addr = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
http://man7.org/tlpi/code/online/dist/pshm/pshm_read.c.html
![Page 65: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/65.jpg)
65man7.org
● How to prevent two process updatingshared memory at the same time?
But...
![Page 66: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/66.jpg)
66man7.org
Synchronization
![Page 67: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/67.jpg)
67man7.org
Synchronization● Synchronize access to a shared resource
● Shared memory– Semaphores
● File– File locks
![Page 68: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/68.jpg)
68man7.org
POSIXsemaphores
![Page 69: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/69.jpg)
69man7.org
POSIX semaphores● Integer maintained inside kernel● Kernel blocks attempt to decrease value below
zero● Two fundamental operations:
● sem_post(): increment by 1● sem_wait(): decrement by 1
– May block
![Page 70: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/70.jpg)
70man7.org
POSIX semaphores● Semaphore represents a shared resource● E.g., N shared identical resources ==> initial
value of semaphore is N● Common use: binary value
● Single resource (e.g., shared memory)
![Page 71: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/71.jpg)
71man7.org
Unnames and named semaphores● Two types of POSIX semaphore:
● Unnamed– Embedded in shared memory
● Named– Independent, named objects
![Page 72: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/72.jpg)
72man7.org
Unnamed semaphores API● sem_init(semp, pshared, value): initialize
semaphore pointed to by semp to value● sem_t *semp● pshared: 0, thread sharing; != 0, process sharing
● sem_post(semp): add 1 to value● sem_wait(semp): subtract 1 from value● sem_destroy(semp): free semaphore, release
resources back to system● Must be no waiters!
![Page 73: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/73.jpg)
73man7.org
Unnamed semaphores example● Two processes, writer and reader● Sending data through POSIX shared memory● Two unnamed POSIX semaphores inside shm
enforce alternating access to shm
![Page 74: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/74.jpg)
74man7.org
Unnamed semaphores example
![Page 75: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/75.jpg)
75man7.org
Header file
#define BUF_SIZE 1024
struct shmbuf { // Buffer in shared memory sem_t wsem; // Writer semaphore sem_t rsem; // Reader semaphore int cnt; // Number of bytes used in 'buf' char buf[BUF_SIZE]; // Data being transferred}
![Page 76: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/76.jpg)
76man7.org
Writerfd = shm_open(SHM_PATH, O_CREAT|O_EXCL|O_RDWR, OBJ_PERMS);ftruncate(fd, sizeof(struct shmbuf));shmp = mmap(NULL, sizeof(struct shmbuf), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
sem_init(&shmp->rsem, 1, 0);sem_init(&shmp->wsem, 1, 1); // Writer gets first turn
for (xfrs = 0, bytes = 0; ; xfrs++, bytes += shmp->cnt) { sem_wait(&shmp->wsem); // Wait for our turn shmp->cnt = read(STDIN_FILENO, shmp->buf, BUF_SIZE); sem_post(&shmp->rsem); // Give reader a turn
if (shmp->cnt == 0) // EOF on stdin? break;}sem_wait(&shmp->wsem); // Wait for reader to finish
// Clean up
![Page 77: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/77.jpg)
77man7.org
Readerfd = shm_open(SHM_PATH, O_RDWR, 0); shmp = mmap(NULL, sizeof(struct shmbuf), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
for (xfrs = 0, bytes = 0; ; xfrs++) { sem_wait(&shmp->rsem); // Wait for our turn */
if (shmp->cnt == 0) // Writer encountered EOF */ break; bytes += shmp->cnt;
write(STDOUT_FILENO, shmp->buf, shmp->cnt) != shmp->cnt); sem_post(&shmp->wsem); // Give writer a turn */}
sem_post(&shmp->wsem); // Let writer know we're finished
![Page 78: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/78.jpg)
78man7.org
Named semaphores API● Object management
● sem_open(): open/create semaphore● sem_unlink(): remove semaphore pathname
![Page 79: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/79.jpg)
79man7.org
Opening a POSIX semaphore● semp = sem_open(name, flags [, mode, value]);● Open+create new / open existing semaphore● name has form /somename
● Can be seen in dedicated tmpfs at /dev/shm
● Returns sem_t *, reference to semaphore● Used by rest of API
![Page 80: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/80.jpg)
80man7.org
Opening a POSIX semaphore● semp = sem_open(name, flags [, mode, value]);● flags (analogous to open()):
● O_CREAT – create SHM if it doesn’t exist
● O_EXCL – create SHM exclusively
● If creating new semaphore:● mode sets permissions● value initializes semaphore
![Page 81: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/81.jpg)
81man7.org
Sockets
![Page 82: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/82.jpg)
82man7.org
Sockets● Big topic● Just a high-level view● Some notable features when running as IPC
![Page 83: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/83.jpg)
83man7.org
Sockets● “A socket is endpoint of communication...”
● ... you need two of them
● Bidirectional● Created via:
● fd = socket(domain, type, protocol);
![Page 84: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/84.jpg)
84man7.org
Socket domains● Each socket exists in a domain● Domain determines:
● Method of identifying socket (“address”)● “Range” of communication
– Processes on a single host– Across a network
![Page 85: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/85.jpg)
85man7.org
Common socket domains● UNIX domain (AF_UNIX)
● Communication on single host● Address == file system pathname
● IPv4 domain (AF_INET)● Communication on IPv4 network● Address = IPv4 address (32 bit) + port number
● IPv6 domain (AF_INET6)● Communication on IPv6 network● Address = IPv6 address (128 bit) + port number
![Page 86: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/86.jpg)
86man7.org
Socket type● Determines semantics of communication● Two main types available in all domains:
● Stream (SOCK_STREAM)
● Datagram (SOCK_DGRAM)
● UNIX domain (on Linux) also provides● Sequential packet (SOCK_SEQPACKET)
![Page 87: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/87.jpg)
87man7.org
Stream sockets● SOCK_STREAM
● Byte stream● Connection-oriented
● Like a two-party phone call
● Reliable == data arrives “intact” or not at all● Intact:
● In order● Unduplicated
● Internet domain: TCP protocol
![Page 88: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/88.jpg)
88man7.org
Datagram sockets● SOCK_DGRAM
● Message-oriented● Connection-less
● Like a postal system
● Unreliable; messages may arrive:● Duplicated● Out of order● Not at all
● Internet domain: UDP protocol
![Page 89: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/89.jpg)
89man7.org
Sequential packet sockets● SOCK_SEQPACKET
● Midway between stream and datagram sockets● Message-oriented● Connection-oriented● Reliable
● UNIX domain● In INET domain, only with SCTP protocol
![Page 90: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/90.jpg)
90man7.org
Stream sockets API
![Page 91: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/91.jpg)
91man7.org
Stream sockets API
![Page 92: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/92.jpg)
92man7.org
Stream sockets API
![Page 93: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/93.jpg)
93man7.org
Stream sockets API● socket(SOCK_STREAM) – create a socket● Passive socket:
● bind() – assign address to socket● listen() – specify size of incoming connection queue● accept() – accept connection off incoming queue
● Active socket:● connect() – connect to passive socket
● I/O: ● write(), read(), close()● send(), recv() – socket specific flags
![Page 94: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/94.jpg)
94man7.org
Datagram sockets API
![Page 95: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/95.jpg)
95man7.org
Datagram sockets API● socket(SOCK_DGRAM) – create socket● bind() – assign address to socket● sendto() – send datagram to an address● recvfrom() – receive datagram and address of
sender● close()
![Page 96: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/96.jpg)
96man7.org
Sockets: noteworthy points● Bidirectional communication● UNIX domain datagram sockets are reliable● UNIX domain sockets can pass file descriptors● Internet domain sockets are only method for
network communication● UDP sockets allow broadcast / multicast of
datagrams● socketpair()
● UNIX domain● Bidirectional pipe
![Page 97: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/97.jpg)
97man7.org
Other criteria affecting choice of an
IPC mechanism
![Page 98: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/98.jpg)
98man7.org
Criteria for selecting an IPC mechanism● The obvious
● Consistency with application design● Functionality
● Let’s look at some other criteria
![Page 99: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/99.jpg)
99man7.org
IPC IDs and handles● Each IPC object has:
● ID – the method used to identify an object● Handle – the reference used in a process to access
an open object
![Page 100: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/100.jpg)
100man7.org
IPC IDs and handles
![Page 101: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/101.jpg)
101man7.org
File descriptor handles● Some handles are file descriptors● File descriptors can be multiplexed via poll() /
select() /epoll● Sockets, pipes, FIFOs● On Linux, POSIX MQ descriptors are file descriptors● One good reason to avoid System V message
queues
![Page 102: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/102.jpg)
102man7.org
IPC access permissions● How is access to IPC controlled?● Possibilities
● UID/GID + permissions mask● Related processes (via fork())● Other
– e.g., Internet domain: application-determined
![Page 103: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/103.jpg)
103man7.org
IPC access permissions
![Page 104: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/104.jpg)
104man7.org
IPC object persistence● What is the lifetime of an IPC object?
● Process: only as long as held open by at least one process
● Kernel: until next reboot– State persists even if no connected process
● Filesystem: persists across reboot– Memory mapped file
![Page 105: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/105.jpg)
105man7.org
IPC object persistence
![Page 106: An introduction to Linux IPCaichaku.github.io/public/pdf/IPC_Overview-LCA-2013... · 2018. 1. 6. · man7 .org 32 Opening a POSIX MQ mqd = mq_open(name, flags [, mode, &attr]); flags](https://reader035.fdocuments.net/reader035/viewer/2022062611/6133188cdfd10f4dd73ade1e/html5/thumbnails/106.jpg)
106man7.org
Thanks! And Questions
Michael [email protected] http://man7.org/tlpi
Linux man-pages [email protected] http://www.kernel.org/doc/man-pages/
(No Starch Press, 2010)
(slides up soon at http://man7.org/conf/)
Ma
ma
ku (
Bla
c k T
ree
Fe
r n)
ima
g e (
c) R
ob
Su
iste
dn
at u
resp
ic. c
om
[email protected]://lwn.net/