Skip to content

Day55 - SCM_RIGHTS File Descriptor Passing

Goal

Learn:

  • sendmsg()
  • recvmsg()
  • ancillary data
  • SCM_RIGHTS
  • epoll on received fd

Environment

  • Raspberry Pi 5
  • Linux kernel 6.x
  • /dev/mypoll driver available

Step 1 - Basic UNIX socketpair

Create socket pair:

socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sv);

Fork parent and child.

Verify simple communication using:

  • sendmsg()
  • recvmsg()

Step 2 - Implement SCM_RIGHTS

Create helper functions:

fdpass_send_fd()
fdpass_recv_fd()

Use:

struct msghdr
struct iovec
struct cmsghdr

Attach fd using:

SCM_RIGHTS
SOL_SOCKET
CMSG_SPACE()
CMSG_LEN()
CMSG_DATA()

Step 3 - Verify Shared File Offset

Parent:

lseek(fd, 8, SEEK_SET);
send_fd(...);

Child:

read(received_fd, ...);

Verify read starts from shared offset.


Step 4 - Verify Open Mode

Parent:

open(path, O_RDONLY);

Child:

write(received_fd, ...);

Expected:

EBADF

Step 5 - eventfd + epoll

Parent:

eventfd()
send_fd()
write(eventfd)

Child:

recv_fd()
epoll_ctl()
epoll_wait()
read(eventfd)

Verify EPOLLIN event.


Step 6 - /dev/mypoll Integration

Parent:

open("/dev/mypoll")
send_fd()

Trigger events:

start
stop
trigger

Child:

epoll_wait()
read("/dev/mypoll")

Expected:

  • timer events
  • manual events
  • socket disconnect handling

Expected Result

Example output:

[INFO] [CHILD] read mypoll: event=21, source=timer
[INFO] [CHILD] read mypoll: event=22, source=timer
[INFO] [CHILD] read mypoll: event=25, source=manual
[WARN] [CHILD] parent disconnected

Learning Outcome

Understand:

  • Linux fd passing model
  • ancillary data
  • epoll integration
  • daemon / worker architecture
  • UNIX socket IPC design