Training > Linux Kernel Development > Developing Applications For Linux (LFD401)
Image Image INSTRUCTOR-LED COURSE

Developing Applications for Linux (LFD401)

Master Linux application development—get hands-on experience with essential tools and techniques in this instructor-led course. Discover the unique features of the Linux environment and build the skills to create powerful applications and open doors to career growth.

NOTE: The price for this instructor-led course will increase from $3,250 to $3,495 on January 1, 2026. Register now to secure any available session at the current rate of $3,250 before the increase.

Image
Who Is It For

This course is for experienced developers. Students should be proficient in C programming, and be familiar with basic Linux utilities and text editors.
read less read more
Image
What You’ll Learn

In this course you will learn about the tools and methods for developing C programs and doing systems programming under Linux, debugging techniques, process management, Linux specific paid and system calls, and more.
read less read more
Image
What It Prepares You For

This course will prepare you to develop applications for a Linux environment.
read less read more
Course Outline
Expand All
Collapse All
Image Introduction
- Objectives
- Who You Are
- The Linux Foundation
- Copyright and No Confidential Information
- Linux Foundation Training
- Certification Programs and Digital Badging
- Linux Distributions
- Platforms
- Preparing Your System
- Using and Downloading a Virtual Machine
- Things Change in Linux and Open Source Projects
Image Preliminaries
- Procedures
- Standards and the LSB
Image How to Work in OSS Projects **
- Overview on How to Contribute Properly
- Know Where the Code is Coming From: DCO and CLA
- Stay Close to Mainline for Security and Quality
- Study and Understand the Project DNA
- Figure Out What Itch You Want to Scratch
- Identify Maintainers and Their Work Flows and Methods
- Get Early Input and Work in the Open
- Contribute Incremental Bits, Not Large Code Dumps
- Leave Your Ego at the Door: Don’t Be Thin-Skinned
- Be Patient, Develop Long Term Relationships, Be Helpful
Image Compilers
- GCC
- Other Compilers
- Major gcc Options
- Preprocessor
- Integrated Development Environments (IDE)
- Labs
Image Libraries
- Static Libraries
- Shared Libraries
- Linking To Libraries
- Dynamic Linking Loader
- Labs
Image Make
- Using make and Makefiles
- Building large projects
- More complicated rules
- Built-in rules
- Labs
Image Source Control
- Source Control
- RCS and CVS
- Subversion
- git
- Labs
Image Debugging and Core Dumps
- gdb
- What are Core Dump Files?
- Producing Core Dumps
- Examining Core Dumps
- Labs
Image Debugging Tools
- Getting the Time
- Profiling and Performance
- valgrind
- Address Sanitizer
- Labs
Image System Calls
- System Calls vs. Library Functions
- How System Calls are Made
- Return Values and Error Numbers
- Labs
Image Memory Management and Allocation
- Memory Management
- Dynamical Allocation
- Tuning malloc()
- Locking Pages
- Labs
Image Files and Filesystems in Linux **
- Files, Directories and Devices
- The Virtual File System
- The ext2/ext3 Filesystem
- Journaling Filesystems
- The ext4/ Filesystem
- Labs
Image File I/O
- UNIX File I/O
- Opening and Closing
- Reading, Writing and Seeking
- Positional and Vector I/O
- Standard I/O Library
- Large File Support (LFS)
- Labs
Image Advanced File Operations
- Stat Functions
- Directory Functions
- inotify
- Memory Mapping
- flock() and fcntl()
- Making Temporary Files
- Other System Calls
- Labs
Image Processes - I
- What is a Process?
- Process Limits
- Process Groups
- The proc Filesystem
- Inter-Process Communication Methods
- Labs
Image Processes - II
- Using system() to Create a Process
- Using fork() to Create a Process
- Using exec() to Create a Process
- Using clone()
- Exiting
- Constructors and Destructors
- Waiting
- Daemon Processes
- Labs
Image Pipes and Fifos
- Pipes and Inter-Process Communication
- popen() and pclose()
- pipe()
- Named Pipes (FIFOs)
- splice(), vmsplice() and tee()
- Labs
Image Asynchronous I/O**
- What is Asynchronous I/O?
- The POSIX Asynchronous I/O API
- Linux Implementation
- Labs
Image Signals - I
- What are Signals?
- Signals Available
- Dispatching Signals
- Alarms, Pausing and Sleeping
- Setting up a Signal Handler
- Signal Sets
- sigaction()
- Labs
Image Signals - II
- Reentrancy and Signal Handlers
- Jumping and Non-Local Returns
- siginfo and sigqueue()
- Real Time Signals
- Labs
Image POSIX Threads - I
- Multi-threading under Linux
- Basic Program Structure
- Creating and Destroying Threads
- Signals and Threads
- Forking vs. Threading
- Labs
Image POSIX Threads - II
- Deadlocks and Race Conditions
- Mutex Operations
- Semaphores
- Futexes
- Conditional Operations
- Labs
Image Networking and Sockets
- Networking Layers
- What are Sockets?
- Stream Sockets
- Datagram Sockets
- Raw Sockets
- Byte Ordering
- Labs
Image Sockets - Addresses and Hosts
- Socket Address Structures
- Converting IP Addresses
- Host Information
- Labs
Image Sockets - Ports and Protocols
- Service Port Information
- Protocol Information
- Labs
Image Sockets - Clients
- Basic Client Sequence
- socket()
- connect()
- close() and shutdown()
- UNIX Client
- Internet Client
- Labs
Image Sockets - Servers
- Basic Server Sequence
- bind()
- listen()
- accept()
- UNIX Server
- Internet Server
- Labs
Image Sockets - Input/Output Operations
- write(), read()
- send(), recv()
- sendto(), recvfrom()
- sendmsg(), recvmsg()
- sendfile()
- socketpair()
- Labs
Image Sockets - Options
- Getting and Setting Socket Options
- fcntl()
- ioctl()
- getsockopt() and setsockopt()
- Labs
Image Netlink Sockets**
- What are netlink Sockets?
- Opening a netlink Socket
- netlink Messages
- Labs
Image Sockets - Multiplexing and Concurrent Servers
- Multiplexed and Asynchronous Socket I/O
- select()
- poll()
- pselect() and ppoll()
- epoll
- Signal Driven and Asynchronous I/O
- Concurrent Servers
- Labs
Image Inter Process Communication
- Methods of IPC
- POSIX IPC
- System V IPC**
- Labs
Image Shared Memory
- What is Shared Memory?
- POSIX Shared Memory
- System V Shared Memory**
- Labs
Image Semaphores
- What is a Semaphore?
- POSIX Semaphores
- System V Semaphores**
- Labs
Image Message Queues
- What are Message Queues?
- POSIX Message Queues
- System V Message Queues**
- Labs
Image Closing and Evaluation Survey
- Evaluation Survey

** These sections may be considered in part or in whole as optional. They contain either background reference material, specialized topics, or advanced subjects. The instructor may choose to cover or not cover them depending on classroom experience and time constraints.
Prerequisites
This course is for experienced developers. Students should be proficient in C programming, and be familiar with basic Linux utilities and text editors.
Reviews
Sep 2025
A good overview of systems programming in Linux; I was able to appreciate the material in good time.
Sep 2025
The content was interesting, and helped to reinforce my C skills and techniques.
Sep 2025
I found this course comprehensive, and will try the labs on my own. All the topics were covered based on the course.
Aug 2024
The material is thorough, and the resources are detailed and plenty.
Aug 2024
The labs are pretty helpful. To have the code, and be able to read it later is the best part.
Aug 2024
Really happy about the content.
Feb 2024
Instructor Frank Edwards was top knotch! His tangents away from, and insights into the source material where very interesting, and helped keep the content engaging.
Feb 2024
The instructor was exceptionally knowledgeable about each topic covered in the course, providing a more practical, "real-world" insight into how the topics connect, rather than just simply linearly going through them.
Feb 2024
The system call section onwards was incredibly useful, I would say that's where 70-80% of the value was for our team.
Nov 2023
Very good course, I really liked it. I look forward to taking LFD420 in a few years time, once I have more experience.
Nov 2023
The instructor, Frank Edwards, was clearly very knowledgeable, and could give practical tips on how something might be useful to a developer, or why something works a certain way. He was also able to answer questions in depth, and communicated clearly.