关于linux signal的问题
答案:1 悬赏:70 手机版
解决时间 2021-04-01 14:36
- 提问者网友:我是女神我骄傲
- 2021-03-31 15:29
关于linux signal的问题
最佳答案
- 五星知识达人网友:猎心人
- 2021-03-31 16:00
也就是说,当GPS数据准备好后会发送signal给你们自己写的平台软件,相当于请求刷屏幕,然后平台软件执行刷屏幕操作,这两个之间需要一个同步关系就是说,当有请求后我才去刷屏幕操作。
这种情况不是因为平台进程接受不到signal,而是收到了signal信号而且正确执行了sem_post操作(你可以在signal handler中加入打印调试语句看看),因为你的刷屏幕操作线程执行时间太长了,导致连续执行好几次屏幕操作,这是种恶性循环(因为gps软件每次数据准备好就发送个signal,而你的 signal在每次捕捉到signal后就执行一次sem_post,然而你的刷屏幕操作时间太长了当执行完一次刷屏幕操作后再次调用sem_wait的时候已经有多个信号量资源了也就是消费跟不上生产,信号量post次数比wait次数多)
#include
#include
#include
#include
#include
#include
sem_t lock;
int gps_data = 0;
void *gps_data_process (void *arg)
{
while (1)
{
sem_wait(&lock);
printf("Data is [%d]\n", gps_data);
sleep(100);
}
}
void gps_data_request(int sig)
{
if (sig == SIGUSR1)
{
sem_post(&lock);
}
}
int main(int argc, char **argv)
{
pthread_t tid;
struct sigaction action;
if (sem_init(&lock, 0, 0) == -1)
{
perror("sem_init");
exit(1);
}
action.sa_handler = gps_data_request;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
if (sigaction(SIGUSR1, &action, NULL))
{
perror("sigaction");
exit(1);
}
if (pthread_create(&tid, NULL, gps_data_process, NULL) == -1)
{
perror("pthread_create");
exit(1);
}
while (1)
{
printf("[GPS]>>>");
scanf("%d", &gps_data);
if (gps_data)
{
raise(SIGUSR1);
}
sleep(1);
}
return 0;
}
这种情况不是因为平台进程接受不到signal,而是收到了signal信号而且正确执行了sem_post操作(你可以在signal handler中加入打印调试语句看看),因为你的刷屏幕操作线程执行时间太长了,导致连续执行好几次屏幕操作,这是种恶性循环(因为gps软件每次数据准备好就发送个signal,而你的 signal在每次捕捉到signal后就执行一次sem_post,然而你的刷屏幕操作时间太长了当执行完一次刷屏幕操作后再次调用sem_wait的时候已经有多个信号量资源了也就是消费跟不上生产,信号量post次数比wait次数多)
#include
#include
#include
#include
#include
#include
sem_t lock;
int gps_data = 0;
void *gps_data_process (void *arg)
{
while (1)
{
sem_wait(&lock);
printf("Data is [%d]\n", gps_data);
sleep(100);
}
}
void gps_data_request(int sig)
{
if (sig == SIGUSR1)
{
sem_post(&lock);
}
}
int main(int argc, char **argv)
{
pthread_t tid;
struct sigaction action;
if (sem_init(&lock, 0, 0) == -1)
{
perror("sem_init");
exit(1);
}
action.sa_handler = gps_data_request;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
if (sigaction(SIGUSR1, &action, NULL))
{
perror("sigaction");
exit(1);
}
if (pthread_create(&tid, NULL, gps_data_process, NULL) == -1)
{
perror("pthread_create");
exit(1);
}
while (1)
{
printf("[GPS]>>>");
scanf("%d", &gps_data);
if (gps_data)
{
raise(SIGUSR1);
}
sleep(1);
}
return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯