gpt4 book ai didi

c++ - SIGALRM 终止进程

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:10 26 4
gpt4 key购买 nike

我在使用 SIGALRM 时遇到了问题。我用它每 3 秒写一次事件进程的 pids。但是一旦它杀死主进程,它就会触发。我做错了什么?一段时间后,我还使用信号杀死每个子进程,我在那里使用 SIGTERM。在我添加此部分以列出事件进程之前,一切都很好。即使在杀死主要的一个之后,其他人仍在继续。

#include <iostream>
#include <string>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <signal.h>
#include <time.h>
#include <map>

using namespace std;
////DARK SORROW PLACE////////////////////////////
#define CHLD_DELAY 3
std::map<pid_t, bool> pidy;
/////////////////////////////////////////////////
void sweetDreams(int sec, int nanosec)
{
timespec ttw;
ttw.tv_sec = sec;
ttw.tv_nsec = nanosec;

while( nanosleep( &ttw, &ttw) && ( errno != EINTR ) ) continue;
}
//////////////////////////////////////////////////
void ns(long int ns, timespec *ts)
{
ts->tv_sec = (time_t)ns/1000000000;
ts->tv_nsec = (long)(ns - ts->tv_sec*1000000000);
}
//////////////////////////////////////////////////
class Order
{
public:
char* table;
int start;
int step;
int shift;
long int dt;
long int dieAfter;
};
////////////////////////////////////////////////////
void killer(int sig, siginfo_t *siginfo, void *context)
{
// kill(siginfo->si_pid, NULL);
_exit(0);
}
////////////////////////////////////////////////////
void carefullDad(int sig)
{
cout << "lista zywych dzieci:\n-----------------------" << endl;
for(auto i : pidy)
{
if( i.second ) cout << i.first << endl;
}
cout << "-----------------------" << endl;
}
////////////////////////////////////////////////////
int main(int argc, char** argv)
{
char test[] = { 't', 'e', 's', 't' };

Order orderArr[2] = {
{test, 0, 2, 0, 1000000000L, 10000000000L},
{test, 1, 3, -32 , 2000000000L, 6000000000L}
};

//pid_t pidArr[sizeof(orderArr) / sizeof(Order)];
pid_t wpid;
int status = 0;

struct sigevent st;
// memset(&st, 0, sizeof(st));
st.sigev_notify = SIGEV_SIGNAL;
st.sigev_signo = SIGALRM;

struct itimerspec it;
//memset(&it, 0, sizeof(it));
it.it_value = { CHLD_DELAY,0L};
it.it_interval = {CHLD_DELAY,0L};

struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_handler = carefullDad;

sigaction(SIGALRM, &act, NULL);

timer_t timer;
timer_create( CLOCK_REALTIME, &st, &timer);
timer_settime(timer, 0, &it, NULL);

for(Order ord : orderArr)
{
// static int i = 0;
pid_t pid = fork();

if(pid == -1)
{
cerr << "Blad!!!" << endl;
exit(1);
}


if(!pid)
{
//some code here
//end rest is here

最佳答案

你忘了设置 act.sa_flags .

struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_handler = carefullDad;
act.sa_flags = 0;

sigaction(SIGALRM, &act, NULL);

当您设置信号处理程序时,它可能设置了 SA_RESETHAND 标志。

关于c++ - SIGALRM 终止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27769470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com