YouTip LogoYouTip

C Function Strsignal

## C Library Function - strsignal() The `strsignal()` function is a utility function in C that retrieves a human-readable description string corresponding to a given signal number. This function is highly useful for debugging, logging, and displaying user-friendly error messages when handling system signals. --- ### Header File Although signals are defined in ``, the `strsignal()` function is declared in the string utility header: ```c #include ``` *(Note: On some POSIX-compliant systems, you may need to define feature test macros such as `#define _GNU_SOURCE` or `#define _POSIX_C_SOURCE >= 200809L` before including the headers to make this function visible.)* --- ### Syntax ```c char *strsignal(int signum); ``` ### Parameters * **`signum`**: The signal number (e.g., `SIGINT`, `SIGSEGV`, `SIGTERM`) whose description string you want to retrieve. ### Return Value * **Success**: Returns a pointer to a null-terminated string that describes the signal. * **Failure**: If the signal number is invalid, some implementations return a pointer to a generic error string (such as `"Unknown signal"`), while others may return `NULL` or a localized equivalent. --- ### Code Example The following example demonstrates how to use the `strsignal()` function within a signal handler. The program registers a custom handler for the `SIGINT` signal (triggered by pressing `Ctrl+C`). When the signal is caught, it prints the signal number along with its descriptive string. ```c #define _GNU_SOURCE // Required on some systems for strsignal #include #include #include #include // Signal handler function void handle_sigint(int sig) { // Retrieve and print the signal description printf("\nCaught signal %d: %s\n", sig, strsignal(sig)); } int main() { // Register the signal handler for SIGINT (Ctrl+C) signal(SIGINT, handle_sigint); // Infinite loop waiting for signals while (1) { printf("Running... Press Ctrl+C to send SIGINT\n"); sleep(1); } return 0; } ``` #### Expected Output When you compile and run the program, and then press `Ctrl+C`, the output will look like this: ```text Running... Press Ctrl+C to send SIGINT Running... Press Ctrl+C to send SIGINT ^C Caught signal 2: Interrupt Running... Press Ctrl+C to send SIGINT ``` --- ### Code Explanation 1. **`signal(SIGINT, handle_sigint);`**: Registers `handle_sigint` as the callback function to execute when the process receives a `SIGINT` signal. 2. **`strsignal(sig)`**: Inside the signal handler, this function takes the signal number `sig` (which is `2` for `SIGINT` on most platforms) and returns its descriptive string representation (`"Interrupt"`). 3. **`printf(...)`**: Outputs the formatted message containing both the numeric signal value and its human-readable description. --- ### Important Considerations * **Thread Safety**: The string returned by `strsignal()` is typically stored in a static buffer or is a read-only string literal. Modifying this string leads to undefined behavior. Because it may share a static buffer, subsequent calls to `strsignal()` in different threads can overwrite the buffer. For thread-safe applications, consider using `sigabbrev_np()` or standard thread-safe alternatives if available. * **Signal-Safe Functions**: Technically, standard I/O functions like `printf()` and string functions like `strsignal()` are **not** async-signal-safe. Calling them inside a signal handler is acceptable for simple demonstration programs, but in production-grade code, you should avoid complex operations inside handlers. Instead, set a volatile flag in the handler and process the signal description in your main execution loop. * **Portability**: `strsignal()` is conforming to POSIX.1-2008. On older or non-POSIX systems (like native Windows environments), this function may not be available.
← C ExternC Function Alarm β†’