永发信息网

关于linux signal的问题

答案:1  悬赏:70  手机版
解决时间 2021-04-01 14:36
关于linux signal的问题
最佳答案
也就是说,当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;

}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
衍生定惊七厘散效果怎么样?每次服用多少比较
电动去发器注册商标属于哪一类?
初一总结前半期的得与失的作文
有谁能告诉我,兄弟是靠什么维持的,现在兄弟
我老婆是1979年农历5月27的生日有谁知道她是
用手机看电影对眼睛坏处大么?有什么恢复智力
秘书有要男的吗?什么的会?
双门冰箱门有高低怎么办
三基色灯管灯的光衰标准是多少(国家标准)
亭湖区南洋镇有几个村
某比赛共有6支队伍参加,比赛采用单循环制,
人类和鬼没有区别
1267你能用这4张牌凑出24吗?
济宁樱花物业家政服务有限公司地址在哪,我要
水浒传中梁山伯先后有三任寨主罩盖之前是谁晁
推荐资讯
黄勃主演在青海无人区盗猎的电影叫啥名?
两会期间有改动婚姻法的情况吗
谁会改QQ在线机型啊?在线等
用绳子勒住脖子,或者用手掐脖子,大概多长时
辽宁山东是一家,二比二平进前八 这句话的出
请问镯子上面没有显示999是真的还是假的
3d导出选定对象时为什么没有max格式
乾龙丙午年是什么时候
有没有什么安卓超级真实模拟开车的游戏,最好
Java POI 如何取当前sheet中合并的单元格区域
56周岁,女,想买社保一次性拿齐,多少钱!交
全世界第一家广播电台是在哪个国家成立的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?