Local Inter-Process Communication
Contents
In one ear, out the other…wait.
Pipes
Pipes allow forked processes to communicate with each other, and is often used to redirect the output of a process into the input of another process.
A common usage pattern for pipes is:
- Create a pipe
- Fork the process (both processes contain the pipe file descriptors)
- Write into the pipe as the parent/child
- Read from the pipe as the child/parent
unistd.h
provides STDIN_FILENO
and STDOUT_FILENO
(and STDERR_FILENO
)
int dup2(int oldfd, int newfd)
Close newfd
if necessary, and copy oldfd
into newfd
.
Effectively, the dup2
function sets newfd
to oldfd
.
For example dup2(fd, STDOUT_FILENO)
will set the output to go into fd
instead of through the standard output
int pipe(int fd[2])
ret: 0
err: -1
The pipe
function allocates a pair of file descriptors in which the first is read from, and the second is written into.
This allows a child process to communicate with the parent process.
FILE *popen(char *Cmd, char *Mode)
ret: FILE*
err: NULL
Message Queues
Message Queues allow for unrelated processes (ie a process that was not forked) to communicate with other processes. As opposed to the buffer stream that pipes provide, message queues separate each message from another.
Note: Message queue names start with a forward slash /
mqueue.h
provides the functionality for message queues.
mqd_t mq_open(char *Name, int Flags)
- Create/open a message queueint mq_close(mqd_t *MQ)
- Close access to a message queueint mq_send(mqd_t MQ, char *Msg, int Size, uint Prio)
- Block and wait until MQ has spaceint mq_receive(mqd_t MQ, char *Msg, int Size, uint *Prio)
- Receive highest priority message in MQ