Это хороший вариант использования для fork
, и я сам использую его в своих тестах.
Вы можете просто fork()
, запустить функцию в дочернем элементе, _exit()
дочерний элемент, получить результат, и, если он указывает, что процессу было сообщено с помощью SIGABRT
, дочерний элемент прервался, в противном случае это не так.
Пример кода:
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
int fork_and_reap(int *Ws, void Fn(void *), void *Arg)
{
pid_t pid; if (0>(pid=fork())) return -1;
if(0==pid) (void)Fn(Arg), _exit(0);
else for(;;){
if(0>waitpid(pid,Ws,WUNTRACED)){
if(EINTR==errno) continue;
else abort();
}else if(!WIFEXITED(*Ws)&&!WIFSIGNALED(*Ws)){ //shouldn't have stopped
if(0>kill(pid,SIGTERM) ||0>kill(pid,SIGCONT)) abort();
}else break;
}
return 0;
}
void aborting(void *A){ (void)A; abort(); }
void not_aborting(void *A){ (void)A; }
int main()
{
int ws;
if(0<=fork_and_reap(&ws, aborting, 0) && WIFSIGNALED(ws) && WTERMSIG(SIGABRT)) puts("aborted"); else puts("didn't abort");
if(0<=fork_and_reap(&ws, not_aborting, 0) && WIFSIGNALED(ws) && WTERMSIG(SIGABRT)) puts("aborted"); else puts("didn't abort");
}