19
IPC Message Queue

IPC Message Queue. Data Structure msgque IP_NOUSED

Embed Size (px)

Citation preview

Page 1: IPC Message Queue. Data Structure msgque IP_NOUSED

IPCMessage Queue

Page 2: IPC Message Queue. Data Structure msgque IP_NOUSED

Data Structure

msgque

IP_NOUSED

Page 3: IPC Message Queue. Data Structure msgque IP_NOUSED

Two channels of Message queue

• channel between normal processes

– IPC_KERNELD not set

• channel between kernel and kernel daemon

– kernel daemon : a process which automatically carries out loading and removing of modules.

– IPC_KERNELD set

Page 4: IPC Message Queue. Data Structure msgque IP_NOUSED

Message

• kerneld_msg{– mtype– id– version– pid– text[1]}

• msgbuf{– mtype– mtext[1]}

header

Page 5: IPC Message Queue. Data Structure msgque IP_NOUSED

sys_msgget()

• allocate a new message queue, or gain access to an existing message queue.

• Flags

– IPC_CREAT : a new queue will be created if it is not yet present=>newque()

– IPC_EXCL : If IPC_CREAT is set and such a queue exists, the function will return with the error EEXIST.

Page 6: IPC Message Queue. Data Structure msgque IP_NOUSED

sys_msgctl()

– IPC_INFO : enters special values in the msginfo structure.

– IPC_STAT : return current values of msqid_ds

– IPC_SET : modify values of msqid_ds

– IPC_RMID : remove all associated message queue structure

Page 7: IPC Message Queue. Data Structure msgque IP_NOUSED

sys_msgsnd()

• Send message to message queue.

• The process blocks if message length exceeds the value in msg_qbytes, the permitted maximum.

• Blocking can be prevented by setting IPC_NOWAIT.

Page 8: IPC Message Queue. Data Structure msgque IP_NOUSED

sys_msgrcv()

• receive messages of specified type from message queue.

–msgtyp = 0 => get first.

–msgtyp > 0 => get first message of matching type.(MSG_EXCEPT not set)

–msgtyp < 0 => get message with least type must be < abs(msgtype).

Page 9: IPC Message Queue. Data Structure msgque IP_NOUSED

Message queue between kernel & kerneld

• IPC_KERNELD set

• kerneld_send()

– responsible for sending messages to the kernel daemon.

– KERNELD_WAIT set if we want an answer from kerneld.

• kerneld_exit()

– called when current process terminated.

Page 10: IPC Message Queue. Data Structure msgque IP_NOUSED

IPC

PIPE

Page 11: IPC Message Queue. Data Structure msgque IP_NOUSED

Data Structure

Page 12: IPC Message Queue. Data Structure msgque IP_NOUSED

do_pipe

• Called by system call pipe

• set up a temporary inode and allocating a page of memory to base.

• Return two file descriptors, one for reading, and one for writing.

Page 13: IPC Message Queue. Data Structure msgque IP_NOUSED

Open Pipe

• pipe_read_open()

• pipe_write_open()

• pipe_rdwr_open()

Page 14: IPC Message Queue. Data Structure msgque IP_NOUSED

Pipe_Select()

• To check whether data can be read from pipe or written to it.

• sel_type:

– SEL_IN : for read

– SEL_OUT : for write

– SEL_EX : for exception

Page 15: IPC Message Queue. Data Structure msgque IP_NOUSED

Pipe read operation

Blocking Non-Blocking

Locked Block calling EAGAIN

pipe process

Empty Block calling process EAGAIN if

pipe if writing process writing processes

present,else return 0 present, else 0

Else Read maximum number of characters up to requested position.

Page 16: IPC Message Queue. Data Structure msgque IP_NOUSED

Pipe write operation

Blocking Non-blockingno reading Send SIGPIPE to writing process

process and return EPIPE

locked pipe atomic write block calling EAGAINpossible, but not process enough space in pipe buffer

Page 17: IPC Message Queue. Data Structure msgque IP_NOUSED

Pipe/FIFO write op(cont.)

Blocking Non-blocking

Buffer space write requested number of bytes

sufficient for to buffer

atomic write continue blocking as for blocking

Else until requested write. Write number of bytes maximum has been written. Possible number

of bytes.

Page 18: IPC Message Queue. Data Structure msgque IP_NOUSED

Release pipe

• pipe_read_release()

• pipe_write_release()

• pipe_rdwr_release()

Page 19: IPC Message Queue. Data Structure msgque IP_NOUSED

Other operation

• pipe_ioctl()

– FIONREAD : write the number of bytes within the file not yet read to address arg.

• pipe_lseek() : invalid.