У меня есть дочерний процесс (созданный с помощью fork), я хочу узнать у родителя, где он умирает, и что-то там делать.В функции handle я хочу использовать функцию класса-члена, поэтому мне нужно передать указатель на «this».
Я думал о двух направлениях:
Option1:
использовать sigaction;
static RpcCmd* rpcCmdPtr = nullptr;// global pointer to save class
в основном:
rpcCmdPtr = this;
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = **sigchldHdl**;
sigaction(SIGCHLD, &act, 0)
/* SIGCHLD handler. */
void **sigchldHdl**(int sig)
{
if(rpcCmdPtr != nullptr)
{
rpcCmdPtr->sigHandler(sig);
}
}
void RpcCmd::sigHandler(int sig)
{ // here are some code...}
Вариант 2:
использовать другой поток, передать указатель на"this" в качестве аргумента и используйте там signalfd;
static void * sigThread(void * arg)
{
rpcCmd* rpcCmdPtr = static_cast<rpcCmd*>(arg)
sigprocmask(SIG_BLOCK, &mask, NULL)
/* Create a file descriptor from which we will read the signals. */
sfd = signalfd (-1, &mask, 0);
while (1) {
struct signalfd_siginfo si;
res = read (sfd, &si, sizeof(si));
if (si.ssi_signo == SIGCHLD)
// more code ...
}
Я хочу знать ЧТО - лучший способ, а ПОЧЕМУ ?
Заранее спасибо.