- 论坛徽章:
- 0
|
我写的一个简单的时钟管理的程序,使用SIGALRM信号,其中用到了time函数。刚开始运行总是出新segment error,我gdb调试之后发现,原来是在执行完time函数之后,我之前malloc出来的一块内存被篡改了,所以报了段错误。我把time函数注释掉之后程序就正常了。所以我非常不解,为什么这个time会篡改内存呢?!还是我的程序写的有问题?!
代码贴在下面,希望帮小弟看看。小弟是个菜鸟,希望大侠指教。- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <signal.h>
- typedef void (* tm_hdlr)(void* data);
- struct listnode {
- unsigned int time;
- tm_hdlr handler;
- void* data;
- struct listnode* next;
- };
- typedef struct listnode* list;
- struct listnode* mknode(list* ls, unsigned int time, tm_hdlr handler, void* data)
- {
- if (ls == NULL)
- return NULL;
-
- struct listnode* tmp = (struct listnode*) malloc(sizeof(struct listnode));
- if (tmp == NULL)
- return NULL;
- tmp->time = time;
- tmp->handler = handler;
- tmp->data = data;
- tmp->next = NULL;
- if (*ls == NULL)
- {
- *ls = tmp;
- return tmp;
- }
- //list cur = *ls, prev;
- struct listnode* head = *ls;
- printf("head time [%d]\n", head->time);
- struct listnode* cur = head;
- struct listnode* prev = head;
- for (; cur != NULL && cur->time < time;)
- {
- prev = cur;
- cur = cur->next;
- }
- if (cur == prev)
- {//insert head
- tmp->next = cur;
- *ls = tmp;
- } else {
- tmp->next = prev->next;
- prev->next = tmp;
- }
- return tmp;
- }
- struct listnode* pollnode(list* ls)
- {
- if (ls == NULL || *ls == NULL)
- return NULL;
- struct listnode* tmp = *ls;
- *ls = (*ls)->next;
- return tmp;
- }
- void rmnode(struct listnode* node)
- {
- free(node);
- }
- void rmlist(list* ls)
- {
- list head = *ls;
- struct listnode* tmp = NULL;
- while (NULL != head)
- {
- tmp = head;
- head = head->next;
- rmnode(tmp);
- }
- *ls = NULL;
- }
- void testlist()
- {
- list ls = NULL;
- mknode(&ls, 10, NULL, NULL);
- mknode(&ls, 3, NULL, NULL);
- mknode(&ls, 8, NULL, NULL);
- mknode(&ls, 5, NULL, NULL);
- mknode(&ls, 1, NULL, NULL);
- struct listnode* node = pollnode(&ls);
- rmnode(node);
- node = pollnode(&ls);
- rmnode(node);
- node = pollnode(&ls);
- rmnode(node);
- rmlist(&ls);
- }
- struct tm_mgr {
- list tm_list;
- struct sigaction tm_osa;
- };
- void th0(void* data)
- {
- printf("th0");
- }
- static struct tm_mgr* g_tm = NULL;
- void sig_alrm(int signum)
- {
- if (g_tm == NULL)
- perror("G_TM == NULL");
- printf("sig_alrm\n");
- if (g_tm->tm_list == NULL)
- {
- printf("IT'S SHOULD NOT BE THIS, THERE IS SOMETHING WRONG!\n");
- return ;
- }
- struct listnode* tmp = pollnode(&(g_tm->tm_list));
- list ls = g_tm->tm_list;
- if (ls == NULL)
- {
- printf("NO NEXT TIME!\n");
- return ;
- }
- //set next one.
- //int now = time();
- int now = 0;
- int firetime = ls->time - now;
- alarm(firetime);
- }
- struct tm_mgr* init_tm()
- {
- struct tm_mgr* tm = (struct tm_mgr*) malloc(sizeof(struct tm_mgr));
- printf("struct tm_mgr size [%d]\n", sizeof(struct tm_mgr));
- tm->tm_list = NULL;
- struct sigaction sa;
- sa.sa_flags = 0;
- sigemptyset(&sa.sa_mask);
- sa.sa_handler = sig_alrm;
- if (-1 == sigaction(SIGALRM, &sa, &(tm->tm_osa)))
- return NULL;
- g_tm = tm;
- return tm;
- //static struct tm_mgr tm;
- //tm.tm_list = NULL;
- //struct sigaction sa;
- //sa.sa_flags = 0;
- //sigemptyset(&sa.sa_mask);
- //sa.sa_handler = sig_alrm;
- //if (-1 == sigaction(SIGALRM, &sa, &(tm.tm_osa)))
- //return NULL;
- //g_tm = &tm;
- //return &tm;
- }
- void reg_timer(struct tm_mgr* tm, unsigned int seconds, tm_hdlr handler, void* data)
- {
- if (tm == NULL)
- return ;
- //PROB!!!!
- //int now = time();
- int now = 0;
- int fire = now + seconds;
- struct listnode* node = mknode(&(tm->tm_list), fire, handler, data);
- list ls = tm->tm_list;
- if (node == ls)
- {//insert at first.
- alarm(seconds);
- }
- }
- //void begin_timer(struct tm_mgr* tm)
- //{
-
- //}
- void term_tm(struct tm_mgr* tm)
- {
- if (-1 == sigaction(SIGALRM, &(tm->tm_osa), NULL))
- return ;
- if (tm != NULL)
- {
- rmlist(&(tm->tm_list));
- free(tm);
- }
- g_tm = NULL;
- }
- void sig_int(int signum)
- {
- reg_timer(g_tm, 1, th0, (void*)0);
- }
- int main()
- {
- //testlist();
- if (SIG_ERR == signal(SIGINT, sig_int))
- perror("SIGNAL");
- struct tm_mgr *tm = init_tm();
- reg_timer(tm, 1, th0, (void*)0);
- reg_timer(tm, 2, th0, (void*)1);
- reg_timer(tm, 3, th0, (void*)2);
- //begin_timer(tm);
- for (;;)
- pause();
- term_tm(tm);
- return 0;
- }
复制代码 |
|