- Dining philosophers problem
The dining philosophers problem was formulated by Edsger Dijkstra in 1965. The problem illustrates synchronization issues in systems made up of concurrent tasks. The objective of the problem is to have progress and avoid deadlock in systems. Also, the entities needing resources should get them in reasonable time and ...
- Program to generate a random password in C
Passwords provide a level of security for digital assets. To be effective, passwords need to sufficiently long. random and chosen from a big underlying domain.In this post, we have a C-language program, that takes in number of characters in the password as input, and chooses a random password from printable ASCII characters. The program ...
- C Programming Tutorial 5: Structures and Unions
A structure, in the C programming language, is a collection of variables for an entity. The variables are known as members of the structure and are located at consecutive memory locations. The size of the structure is the sum of sizes of the members plus any padding that might be placed ...
- C Programming Tutorial 4: Pointers and Arrays
A pointer variable holds the address of another variable. It is said to be "pointing" to that variable. For example,
defines a variable
ip of type integer pointer. ip points to a variable of type integer. At the implementation level, it holds the address of a variable to type ...
- C Programming Tutorial 3: Control Flow and Functions
A C program comprises of global data and functions. A program must have a main function and the execution starts at the first statement in the main function. A function has local data and statements. The control flow deals with the order in which statements are executed by a program. In this post, we ...
- C Programming Tutorial 2: Data Types and Expressions
Data is an important part of a program. In fact, programs are written so that data can be captured, processed, stored and presented to the user. The success of a program depends on how well data has been organized and used. In this post, we will be looking at data types and expressions in ...
- C Programming Tutorial 1 – Getting Started
C is a procedural programming language invented by Dennis Ritchie in 1972. C is, possibly, the most widely used programming language in the last fifty years. There are some unique features of C. It is a small language; so it can be ...
- I/O multiplexing: select, poll and epoll in Linux
1.0 I/O multiplexing
I/O multiplexing is the the ability to perform I/O operations on multiple file descriptors. Input operations like read, accept and calls for receiving messages block when there is no incoming data. So, if an input call is made and it blocks, we may miss data from other file descriptors. To circumvent this, I/O ...
- POSIX real-time signals in Linux
Signals are notifications delivered asynchronously to a process by the kernel. Signals are grouped in two categories. First, there are standard signals, which have been there since the early days of Unix. Second, there are POSIX real-time signals which are specified in POSIX.1b, or, IEEE Std 1003.1b-1993, for Real-time Extensions ...
- How to create a temporary file in Linux
1.0 Temporary Files
Quite often, we need temporary files in our programs. Some intermediate data needs to be stored and the file can be discarded when the process terminates. There are functions and command to create temporary files in Linux. The mkstemp function creates a temporary file and returns a file descriptor. The ...
- Interprocess Communication using Unix Domain Sockets
1.0 Unix Domain Sockets
A socket is a communication endpoint at a host computer. The socket API provides calls for communication between processes. The socket system call is,
int socket (int domain, int type, int protocol);
The first parameter to the socket system call is the domain. The domain is actually the communication domain and it ...
- File I/O in Linux
1.0 Input and Output (I/O)
All programs need to interact with the external world which makes I/O important. Programs store data in files which provide large persistent storage. In this post we will look at the system calls and functions for file I/O and the issues that govern the program and I/O device interaction.
2.0 Buffered I/O
- How to trim a string in C
The problem of removing leading and trailing whitespace characters in strings occurs in programming quite often. Here is a solution.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> void trim (char *dest, char *src); int main (int argc, char ...
- Socket programming using the select system call
1.0 Client-Server Paradigm
The Client-Server paradigm divides the software architecture of a system in two parts, the server and its clients. The server works in the background and maintains the system-wide database. Using the database, it provides the ...
- Socket Programming using UDP in C
1.0 Datagram sockets
There are two major types of network sockets, viz. Stream sockets (SOCK_STREAM) and Datagram sockets (SOCK_DGRAM). The socket type defines the semantics of communication between this socket and its remote counterpart. Stream sockets provide full-duplex reliable sequenced data streams. Datagram sockets support connectionless unreliable messages between the source and destination ...
- Socket Programming using TCP in C
1.0 Client-server model
Client server model is a software architecture paradigm prevalent in distributed applications. A server has information resources and processes that provide answers to queries and other services to remote clients over the network. Some of the examples of these services ...
- Signals in Linux
A signal is a notification delivered to a process by the kernel. A signal indicates that an event has occurred and the process must take note of it. Signals are mostly delivered asynchronously to a process. Whatever the process was doing is suspended and the processing of the signal takes place immediately.
- D-Bus Tutorial
D-Bus is a mechanism for interprocess communication under Linux and other Unix-like systems. D-Bus has a layered architecture. At the lowest level is the D-Bus wire protocol described in the D-Bus Specification. The libdbus library is an implementation of the wire protocol. It provides the C Language interface for ...
- POSIX Shared Memory in Linux
1.0 Shared Memory
Shared memory is the fastest method of interprocess communication (IPC) under Linux and other Unix-like systems. The system provides a shared memory segment which the calling process can map to its address space. After that, it behaves just like any other part of the process's address space.
2.0 Why is shared memory the ...
- System V Shared Memory in Linux
1.0 Shared Memory
Shared memory is one of the three interprocess communication (IPC) mechanisms available under Linux and other Unix-like systems. The other two IPC mechanisms are the message queues and semaphores. In case of shared memory, a shared memory segment is created by the kernel and mapped to the data segment of the address ...
- Queue implementation in C using linked list
A queue is something we see often in our daily lives. People stand in a queue to get into a bus, to get food in a buffet, buy tickets from the ticket counter, etc. Queues are a fair solution of ordering people to get a resource; people are served in the chronological order ...
- POSIX Threads Synchronization in C
1.0 POSIX Threads Synchronization
POSIX Threads provide multiple flows of execution within a process. The threads have their own stacks but share the global data and the heap. So the global variables are visible to multiple threads. Also, the threads need to synchronize their actions so that they jointly realize the overall ...
- POSIX Threads Programming in C
- POSIX Semaphores in Linux
Semaphores are used for process and thread synchronization. Semaphores are clubbed with message queues and shared memory under the Interprocess Communication (IPC) facilities in Unix-like systems such as Linux. There are two varieties of semaphores, the traditional System V semaphores and the newer POSIX semaphores. In ...
- System V Semaphores in Linux
A semaphore is a mechanism for synchronizing processes and threads. Semaphore, in Unix-like systems, are provided under interprocess communication (IPC) facilities along with message queues and shared memory. While message queues can be used by themselves for interprocess communication, semaphores are needed for implementing shared memory based interprocess communication systems. Semaphores are ...
- Semaphore Basics
A semaphore is a signalling mechanism used to regulate access to a shared resource like a railroad track. A semaphore is used to signal to the driver of a train whether he can go ahead on the track or not. The upward ...
- POSIX message queues in Linux
1.0 POSIX Message queues
POSIX interprocess comunication (IPC) was introduced in the POSIX.1b standard (IEEE Std 1003.1b-1993) for real time extensions. POSIX message queues have been made available in Linux since the version 2.6.6 (May 2004). POSIX IPC calls are as per the standard but may not be available on older Unix-like systems. Compared ...
- System V message queues in Linux
1.0 Message queues
Message queues are one of the interprocess communication mechanisms available under Linux. Message queues, shared memory and semaphores are normally listed as the three interprocess communication mechanisms under Linux. Semaphores, though, are really for process synchronization. In practice, shared memory, aided by semaphores, makes an interprocess communication mechanism. Message queues is the ...
- FIFOs in Linux
FIFOs are pipes with a name and are also commonly referred to as
named pipes. Pipes are common on Linux command lines but do not have a system-wide name. So, any two processes that wish to communicate using a pipe need to be related, either parent and child or, sharing a common parent, ...
- Pipes in Linux
1.0 Interprocess communication
A process is an active operating system entity which executes programs. Normally, a process, like a specialist, does one particular job (well). In real life, there are complex workflows and we, often, have multiple processes collaborating to accomplish certain objectives. In order to work together, processes need to exchange ...
- fork and exec system calls in Linux
1.0 fork and exec system calls
Suppose we wish to write a "shell program" which would execute another program. Now, in a computing system, a process executes a program. So this shell program (or, process, at run time) needs to create a process which would execute a program. Here, two system calls ...
- Program, Process and Threads
The definition of program is linked to the definition of algorithm. An algorithm is a sequence of finite steps which can be executed mechanically to solve a problem. The key points are that algorithms are self-contained; the steps given are sufficient to solve the problem at hand. No additional information is required. Also, ...