弗远

2012年1月14日

通用快排

摘要: 今天上午还得上最后半天班,数着时间一分一秒,实在是无聊至极。唉!练习练习算法打发时间吧!先写通用快排。 快排最主要的是确定枢轴并将枢轴定位,确定枢轴是比较有技术含量的,基于我是打发时间,所以就不给自己找别扭了,还是来点easy的吧! 代码如下:#include <stdlib.h>#include <stdio.h>#include <string.h>static int partition(void* arr, int(*cmp)(void*, void*), int left, int right, int size){ char* tmp = (ch 阅读全文

posted @ 2012-01-14 09:59 弗远 阅读(150) 评论(0) 推荐(0) 编辑

2011年12月11日

被中断的函数

摘要: 低速系统调用是可能使进程永远阻塞的一类系统调用,例如read。当不希望进程被这类调用永远阻塞的时候,可以用信号来中断它,当信号处理函数返回的时候,那么这类调用还会回到被中断的指令行吗?有些可以,有些不可以。《apue》列出了所有可以自动重启的系统调用。 那么当一个信号的信号处理函数被其他信号中断的时候还可以再回到被中断处吗?答案是肯定的。而且就算设定了SA_INTERRUPT标志也还是能回到被中断信号处理函数中的被中断处。我觉得肯定有办法让信号处理函数被中断后就不再重启,至于究竟怎么做,有待探究! 阅读全文

posted @ 2011-12-11 12:37 弗远 阅读(151) 评论(0) 推荐(0) 编辑

2011年12月8日

setjmp在非主函数中调用

摘要: 一个进程的正常结束方式应当是从main函数调用exit返回(一般情况下),若是进程在main函数中调用longjmp进入了其他函数会发生什么情况呢? 程序的逻辑布局一般包括代码段、数据段、栈、堆...代码段是程序的指令集合。当一个函数被调用的时候,当前执行指令会跳转到被调用函数所对应代码段。而在跳转之前,会开辟一个该函数的栈帧,函数的返回地址(即当该函数执行完所应返回的地址)以及函数中所有的局部变量都会被保存于此栈,而这所有的动作被执行的前提是该函数显式的被调用。那么回到刚才的问题,在main函数中调用longjmp进入其他函数的时候,该函数不是被显示的调用,所以,该函数没有对应的栈帧,... 阅读全文

posted @ 2011-12-08 00:55 弗远 阅读(221) 评论(0) 推荐(0) 编辑

setjmp与longjmp

摘要: 程序:#include <stdio.h>#include <stdlib.h>#include <setjmp.h>jmp_buf jmpbuf;void test_fun();int main(int argc, char* argv[]){ int a = 0; int flag = false; register int reg = 0; if (setjmp(jmpbuf) != 0) { printf("a:%d reg:%d\n", a, reg); flag = true; printf("error\n&quo 阅读全文

posted @ 2011-12-08 00:25 弗远 阅读(177) 评论(0) 推荐(0) 编辑

导航