我对时钟睡眠有些困难,但一步一步:
我的程序对SIGUSR1 sygnal的反应
我的程序应该做无休止的循环,直到从时钟获得信号为止。
但它不起作用-发送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
的信号处理程序使用的堆栈不同。因此,在处理wyjsc
时,SIGUSR1
的SIGALRM
(位于为调用创建的堆栈上)不会(重新)设置。
要解决此问题,请将wyjsc
设为全局,例如:
sig_atomic_t wyjsc = 0;
关于c - Linux中的Clock_nanosleep,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34568289/