Command-Line Arguments & Signal Handling in C
This document covers Command-Line Arguments & Signal Handling in C.
Command-line arguments allow users to pass input values when executing a program. Signal handling enables programs to respond to system signals such as Ctrl+C (SIGINT) or termination signals (SIGTERM).
In this section, we will cover:
- Command-Line Arguments (argc, argv[])
- Handling Multiple Arguments
- Converting String Inputs to Numbers (atoi, strtol)
- Signal Handling (signal.h, SIGINT, SIGTERM)
- Catching and Ignoring Signals
- Graceful Termination of a Program
Command-Line Arguments (argc, argv[]
)
Command-line arguments allow passing values when running a program from the terminal.
Understanding argc
and argv[]
Understanding argc
and argv[]
Argument | Description |
---|---|
argc | Argument count (number of command-line arguments) |
argv[] | Argument vector (array of argument strings) |
Basic Command-Line Argument Handling
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Argument count: %d\n", argc);
for (int i = 0; i < argc; i++) {
printf("Argument %d: %s\n", i, argv[i]);
}
return 0;
}
Example Run:
./program hello world
Output:
Argument count: 3
Argument 0: ./program
Argument 1: hello
Argument 2: world
argv[0]
is always the program name. Arguments are passed as strings.
Converting Arguments to Integers (atoi
, strtol
)
Command-line arguments are always strings. Convert them to numbers using:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s <num1> <num2>\n", argv[0]);
return 1;
}
int num1 = atoi(argv[1]);
int num2 = atoi(argv[2]);
printf("Sum: %d\n", num1 + num2);
return 0;
}
atoi()
converts a string to an integer (use strtol()
for better error handling). Always validate arguments before conversion.
Signal Handling in C (signal.h
)
Signals allow communication between processes and the OS. Programs can handle signals like SIGINT (Ctrl+C) and SIGTERM (termination request).
Catching SIGINT (Ctrl+C)
#include <stdio.h>
#include <signal.h>
void handle_sigint(int sig) {
printf("Caught signal %d (Ctrl+C), exiting safely...\n", sig);
}
int main() {
signal(SIGINT, handle_sigint);
while (1) {
printf("Running... Press Ctrl+C to exit.\n");
sleep(2);
}
return 0;
}
signal(SIGINT, handle_sigint);
registers the signal handler.- Prevents abrupt termination, allowing cleanup before exit.
Ignoring a Signal (SIGINT
, SIGTERM
)
#include <stdio.h>
#include <signal.h>
int main() {
signal(SIGINT, SIG_IGN); // Ignore Ctrl+C
while (1) {
printf("You cannot stop me with Ctrl+C!\n");
sleep(2);
}
return 0;
}
Use Case: Prevents unintended termination of critical processes.
Graceful Termination (SIGTERM
)
A program can handle termination requests (SIGTERM) and perform cleanup.
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
void handle_sigterm(int sig) {
printf("Received termination signal %d. Cleaning up...\n", sig);
exit(0);
}
int main() {
signal(SIGTERM, handle_sigterm);
while (1) {
printf("Running... Send SIGTERM to stop.\n");
sleep(2);
}
return 0;
}
Use Case: Servers, background processes, and daemons should clean up resources before exiting.