Signals in Fortran
Here’s the translation of the Go code to Fortran, with explanations in Markdown format suitable for Hugo:
Our program demonstrates how to handle signals in Fortran. It will gracefully shut down when it receives a termination signal.
program signal_handler
use, intrinsic :: iso_c_binding, only: c_int, c_funptr
use, intrinsic :: iso_fortran_env, only: error_unit
implicit none
interface
function signal(signum, handler) bind(c)
import
integer(c_int), value :: signum
type(c_funptr), value :: handler
type(c_funptr) :: signal
end function signal
end interface
type(c_funptr) :: int_handler, term_handler
print *, "Awaiting signal"
int_handler = signal(2, c_funloc(handle_sigint))
term_handler = signal(15, c_funloc(handle_sigterm))
! Main program loop
do
call sleep(1)
end do
contains
subroutine handle_sigint() bind(c)
print *, "Interrupt signal received"
call exit(0)
end subroutine handle_sigint
subroutine handle_sigterm() bind(c)
print *, "Termination signal received"
call exit(0)
end subroutine handle_sigterm
end program signal_handler
In Fortran, we use the signal
function from the C library to set up signal handlers. We define two handler subroutines: one for the interrupt signal (SIGINT, usually triggered by Ctrl+C) and one for the termination signal (SIGTERM).
The program sets up these handlers and then enters an infinite loop, waiting for a signal. When a signal is received, the appropriate handler is called, which prints a message and exits the program.
To compile and run this program:
$ gfortran -o signal_handler signal_handler.f90
$ ./signal_handler
Awaiting signal
^C
Interrupt signal received
In this example, we use Ctrl+C to send an interrupt signal, causing the program to print “Interrupt signal received” and then exit.
Note that Fortran doesn’t have built-in support for channels or goroutines like Go does. Instead, we use a more traditional approach with signal handlers. The concept of graceful shutdown remains the same, but the implementation details differ due to the language’s features and idiomatic practices.