Маска сигнала процесса наследуется по exec
, поэтому вы можете просто написать небольшую программу-обертку, которая блокирует SIGINT
и выполняет цель:
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
sigset_t sigs;
sigemptyset(&sigs);
sigaddset(&sigs, SIGINT);
sigprocmask(SIG_BLOCK, &sigs, 0);
if (argc > 1) {
execvp(argv[1], argv + 1);
perror("execv");
} else {
fprintf(stderr, "Usage: %s <command> [args...]\n", argv[0]);
}
return 1;
}
Если вы скомпилируете эту программу в noint
, вы просто выполнили бы ./noint ./y
.
Как отмечается в комментариях, расположение сигналов также наследуется, так что вы можете заставить оболочку игнорировать сигнал вместо того, чтобы блокировать его:
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
struct sigaction sa = { 0 };
sa.sa_handler = SIG_IGN;
sigaction(SIGINT, &sa, 0);
if (argc > 1) {
execvp(argv[1], argv + 1);
perror("execv");
} else {
fprintf(stderr, "Usage: %s <command> [args...]\n", argv[0]);
}
return 1;
}
(и, конечно, для подхода пояса и брекетов, вы могли бы сделать оба).