gpt4 book ai didi

Linux 中的 Clock_nanosleep

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:15 25 4
gpt4 key购买 nike

我对 clock_nanosleep 有一些困难,但一步一步来:

  • 我的程序对 SIGUSR1 信号使用react

  • 我的程序应该无限循环,直到从 clock_nanosleep 获得 SIGALRM。

但它不起作用 - 在发送 SIGUSR1 程序后一直执行无限循环!有人帮忙吗?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <time.h>
#include <fcntl.h>

int fd;

void czekaj_czas()
{
struct sigevent evp;
struct itimerspec ts2;
timer_t timer;
int ret2 ;

evp.sigev_value.sival_ptr = &timer;
evp.sigev_notify = SIGEV_SIGNAL;
evp.sigev_signo = SIGALRM;

ret2 = timer_create(CLOCK_MONOTONIC,&evp,&timer);
if(ret2)
perror("Blad funkcji timer_create");

ts2.it_interval.tv_sec = 3;
ts2.it_interval.tv_nsec = 0;
ts2.it_value.tv_sec = 3;
ts2.it_value.tv_nsec = 0;

if(timer_settime(timer,0,&ts2,NULL))
perror("timer_settime");

}

void handler_signal(int signal)
{
sigset_t pending; // syngaly oczekujace
int losowy_czas ;
struct timespec ts;
int ret;
char buf[10];

int ret3;

ssize_t ret_out;

int wyjsc = 1;
int j = 0;

srand((unsigned int) time(NULL));
losowy_czas = rand() % 15 + 5;
ts.tv_sec = 0;
ts.tv_nsec = losowy_czas * 100000000;

ret = clock_nanosleep(CLOCK_MONOTONIC,0,&ts,NULL);


switch(signal)
{
case SIGUSR1:
czekaj_czas();
break;
case SIGALRM:
wyjsc = 0;
break;
default:
fprintf(stderr,"Zlapany zly sygnal: %d \n", signal);
return;
}


if(ret)
perror("Funkcja zakonczona, signal dostarczony do procesu");


fd = open("file.txt", O_RDWR | O_CREAT | O_APPEND);
snprintf(buf, 10, "cos cos");
while(wyjsc)
{
ret_out = write(fd, buf, strlen(buf));
if(ret_out == -1)
perror("blad zapisu do bliku");
}

}
int main(int argc, char *argv[])
{
int i;
long val;
char *endptr;
struct sigaction sa;
int fd;


sa.sa_handler = &handler_signal;
sa.sa_flags = SA_RESTART | SA_NODEFER ;

//blokowanie wszystkich innych sygnalow
sigfillset(&sa.sa_mask);

if(sigaction(SIGUSR1,&sa,NULL) == -1)
{
perror("Nie mozna obsluzyc SIGUSR1");
}

if(sigaction(SIGALRM,&sa,NULL) == -1)
{
perror("Nie mozna obsluzyc SIGALRM");
}

for(i=0; i<2000; i++)
{
printf("Running %i \n", i);
sleep(1);
}

return;
}

最佳答案

SIGALRM 调用的信号处理程序与为 SIGUSR1 调用的信号处理程序使用的堆栈不同。因此,当 SIGALRM 得到处理。

要解决此问题,请使 wyjsc 全局化,例如:

sig_atomic_t wyjsc = 0;

关于Linux 中的 Clock_nanosleep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34568289/

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