指针-apue第10章的题,关于使进程可以设置任意数量的定时器的问题

问题描述

apue第10章的题,关于使进程可以设置任意数量的定时器的问题

#include
#include
#include
#include
#include
#include
#include

#define MAX_TIMERS 100
#define TRUE 1
#define FALSE 0
#define MAX_LONG_TIME 500
#define MAX_LINE 50

struct timer{
int inuse;
time_t time;
char event;
} timers[MAX_TIMERS];
struct timer
timer_next = NULL;
time_t time_timer_set;
sigset_t newmask,oldmask;

volatile time_t time_now(void);
void undeclare(struct timer );
struct timer *declare(unsigned int,char
);
void timers_update(time_t);
int disable_interrupt(void);
void start_physical_timer(time_t);
int enable_interrupt(void);
void timer_interrupt_handler(void);

int
main(int argc,char argv[])
{
int i,j,k,l,time;
char number[MAX_LINE];
char program[MAX_LINE];
struct sigaction action,old;
action.sa_handler = timer_interrupt_handler;
action.sa_flags = 0;
sigaction(SIGALRM,&action,&old);
if(argc == 1) {
fprintf(stderr,"big bro ,i hate you");
exit(0);
}
while(
++argv != NULL){
j=strlen(*argv);
for(i=0;i<j;i++)
if (isalpha(*argv[i])) break;
strcnpy(number,*argv,i-1);
time = (unsigned int)atoi(number);
for(k=i;k<j;k++)
program[l++] = *argv[k];
declare(time,program);
}

return 0;
}

void
start_physical_time(time_t lon)
{
if(alarm((unsigned int)lon) < 0)
fprintf(stderr,"alarm error");
}

void
timer_interrupt_handler(void)
{
time_t t =time_now();
timers_update( t - time_timer_set);
if (timer_next) {
time_timer_set = t;
start_physical_timer(timer_next->time);
}
}

void timers_update(time_t gap)
{
int i;
static struct timer last_time {
FALSE,
MAX_LONG_TIME,
TRUE
};
timer_next = &last_time;
for(i=0;i
if (timers[i]->time >gap) {
timers[i]->time -=gap;
if (timers[i]->time < timer_next->time)
timer_next = &timers[i];
} else {
*timers[i]->event = TRUE;
timers[i]->inuse = 0;
}
}
if (!timer_next->inuse) timer_next = 0;
}

struct timer*
declare(unsigned int time,char *event)
{
int i;
time_t t;
for(i=0;i
if(!timers[i]->inuse)
break;
if (i == MAXTIMERS) {
return 0;
}
timers[i]->time = (time_t)time;
timers[i]->event = event;
if (!timer_next) {
time_timer_set = t;
start_physical_timer(timers[i]->time);
} else if (time+t < timer_next->time+time_time_set) {
timers_update(t - time_timer_set);
time_timer_set = t;
start_physical_timer((timer_next = t)->time);
}else {}
timers[i]->inuse = TRUE;
return (timers[i]);
}

volatile time_t
time_now(void)
{
static long clk;
clk = sysconf(_SC_CLK_TCK);
clock_t sum;
struct tms *buf;
times(buf);
sum = buf->tms_utime+buf->tms_stime;
return (time_t)(sum/clk);
}
还没有完成,没有加入信号的控制,编译了一下,发现结构数组的结构指针无效,给出的错误为error: invalid type argument of ‘->’ (have ‘struct timer’)
timers[i]->event = event;
还有这个 error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
static struct timer last_time {
^
timer.c:86:2: error: expected ‘;’ before ‘}’ token
};困扰我一上午了,求大神解答,谢谢了

解决方案

http://blog.chinaunix.net/uid-738944-id-3395433.html

时间: 2024-09-20 11:49:36

指针-apue第10章的题,关于使进程可以设置任意数量的定时器的问题的相关文章

[剑指Offer] 第3章课后题详解

[剑指Offer] 第3章课后题详解 目录 剑指Offer 第3章课后题详解 目录 大数加法 分析 解法 优化 链表的中间节点 分析 解法 环形链表 分析 解法 反转链表 分析 解法 大数加法 本题为<剑指Offer>"面试题12:打印1到最大的n位数"一节中的"相关题目". 定义一个函数,在该函数中可以实现任意两个整数的加法. 分析 由于没有限定输入两个数的大小范围,所以需要把它当做大数问题来处理.大数无法用int,long甚至long long类型来

[剑指Offer] 第2章课后题详解

[剑指Offer] 第2章课后题详解 目录 剑指Offer 第2章课后题详解 目录 有序数组的插入 分析 正常解法 非主流解法 两个队列实现栈 分析 解法 2的整数次方 分析 解法 不同位数 分析 解法 有序数组的插入 本题为<剑指Offer>"面试题4:替换空格"一节中的"相关题目". 有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2.请实现一个函数,把A2中的所有数字插入到A1中并且所有数字是排序的. 分析 其实这道题就是实现一

jBPM-4.0中文开发指南-第10章 委派类

第 10 章 委派类 10.1. 什么是委派类 委派类是实现了Activity或 Condition的类. 根据流程虚拟机的期待,这里有外部类提供了程序逻辑, 插入到PVM的图形执行中. 外派类可以被流程语言 和最终用户提供. 10.2. 委派类的配置 委派类可以实现配置化.成员变量可以包含配置参数, 所以一个委派类可以在 每次使用的时候进行不同的配置.比如, 在Display活动中, 打印到控制台的信息就是一个 配置参数. 委派类应该是无状态的,这意味着执行接口方法 应该不会改变成员变量的值.

[剑指Offer] 第4章课后题详解

[剑指Offer] 第4章课后题详解 目录 剑指Offer 第4章课后题详解 目录 二叉树的镜像 分析 解法 拓展 判断前序遍历 分析 解法 拓展 字符的组合 分析 解答 正方体的顶点 分析 解法 8个皇后 分析 解法 二叉树的镜像 本题为<剑指Offer>"面试题19:二叉树的镜像"一节中的"本题拓展". 请完成一个函数,输入一个二叉树,该函数输出它的镜像,要求使用循环的方法,不能用递归.二叉树节点定义如下: struct BinaryTreeNode

第10章 多环境下构建项目

第10章 多环境下构建项目 本章根据实际情况,介绍多种部署环境下构建项目的配置. 在大多数公司,都会有多种项目的运行环境,例如:开发环境.测试环境.预发布环境.正式环境- 我们都会遇到这样一个问题,不同环境的一些配置是不同的,例如:数据库配置.网银接口的账号和地址配置.邮箱和短信账号配置等等.那么在maven构建项目时,需要根据不同的环境,打包不同配置. 还是用我们的crm项目进行演示,基本项目目录: 10.1 属性配置 首先,在parent项目中配置不同环境的属性,例如,我们的数据库链接和re

unix系统编程-关于apue第三章fcntl函数

问题描述 关于apue第三章fcntl函数 其中的if(val & O_APPEND )是什么意思,还有就是fcntl(fdF_SETFL0):和fcntl(fdF_GETFL0)第三个参数设置为0 分别是什么意思 解决方案 fcntl()函数fcntl函数fcntl 函数

[剑指Offer] 第5章课后题详解

[剑指Offer] 第5章课后题详解 目录 剑指Offer 第5章课后题详解 目录 删除指定字符 分析 解法 优化 删除重复元素 分析 解法 判断变位词 分析 解法 求助 删除指定字符 本题为<剑指Offer>"面试题35:第一个只出现一次的字符"一节中的"相关题目". 定义一个函数,输入两个字符串,从第一个字符串中删除在第二个字符串中出现过的所有字符. 分析 字符是一个长度为8的数据类型,共256种可能.创建一个长度为256的bool型数组,数组下标为

《Total Commander:万能文件管理器》——第10章.中文相关问题

第10章.中文相关问题 Total Commander 自从 v7.5 开始,全面支持 unicode,当然也包括中文.但由于文件默认编码.旧版插件.非官方汉化等多种原因,一些用户遇到了中文相关问题.特开设此篇,专门解答. TC有无中文网站? 水木社区的 TotalCommander(超强万能管理器) 版 :最权威.最活跃的TC中文论坛,高手众多.善用佳软曾任版主,最早的TC团购就是始于该版.版面发言需注册,但阅读及下载附件无需注册. TC中文网站:是TC官网的完整.精确中文镜像,由国内TC爱好

【PMP认证考试之个人总结】第 10 章 项目风险管理

第 10章 项目风险管理 <PMP个人备考笔记(全篇)>下载 10.1 综述   10.2 规划风险管理   风险管理计划:描述如何安排与实施风险管理活动,内容包括: ①方法论:如何管理项目的风险: ②角色和职责:谁负责识别风险.谁负责规划风险应对: ③预算:计划花多少钱在风险管理上面: ④时间安排:什么时候识别和规划风险.什么时候控制风险,建立应急储备方案: ⑤风险类别(RBS):这是根据以往的经验.历史信息总结的常见的风险的类别.这是个结构化的工具,帮助识别风险: ⑥风险概率和影响的定义: