分类:C/CPP

C/CPP, Unix Like

解除clock_gettime@@GLIBC_2.17的依赖

在x86_64的Debian Jessie上交叉编译一个mipsel架构的程序,能静态链接的都静态链接了。 程序编译好传送到mipsel架构的设备上时,ldd查看库的依赖,却提示 /lib/mipsel-linux-gnu/libc.so.6: version `GLIBC_2.17′ not found (⊙﹏⊙)b mipsel设备上运行着Debian Wheezy,使用的是glibc 2.13: # /lib/mipsel-linux-gnu/libc.so.6 GNU C Library (Debian EGLIBC 2.13-38+deb7u11) stable release ve […]

Read more No Comments
C/CPP, 编程

探讨C语言返回struct的实现

C语言基本类型的返回通过寄存器实现。 寄存器容量不大,一个结构体的大小不定,多塞几个成员,很容易就会超过寄存器的容量,不太可能通过寄存器一次性返回一个结构体。 把以下代码转为汇编,探个究竟: // return_struct.c struct the_struct { int num1; int num2; double num3; double num4; int *num_ptr1; int *num_ptr2; }; struct the_struct fun() { struct the_struct the_struct1; the_struct1.num1 = 1; the_str […]

Read more 2 Comments
C/CPP, 编程

关于Visual Studio C LANG下pow()函数的重载

当初看到Visual Studio 2010的这个提示,我真当VS实现了C LANG的函数重载。 今天即兴尝试VS下C LANG的函数重载,虽然IDE没报语法错误,但编译器编译时会报错。无奈之下只好打开长长的math.h一探究竟。 通过全文搜索很容易找到math.h声明的pow()原型: double __cdecl pow(_In_ double _X, _In_ double _Y); inline double __CRTDECL pow(_In_ double _X, _In_ int _Y) {return (_Pow_int(_X, _Y)); } inline float __C […]

Read more No Comments
C/CPP

为何C语言函数可以返回struct

struct可由多个数据类型构成,初步看起来应该类似数组,变量本身是一个指向首字节的指针,无法直接通过此指针赋值struct,在函数中声明为自动变量时,也无法返回此指针所指向的值。 但事实上就并非如此,struct之间可以直接赋值,使用指针指向其地址时需要使用”&”,函数中声明为自动变量时可以直接return其值。 那struct变量本身到底是何? 写了这样一个东西,运行后瞬间明白: #include <stdio.h> #include <string.h> struct my_struct { unsigned char ch1; u […]

Read more 1 Comment
C/CPP, Unix Like, 操作系统, 编程

Linux chroot Shell —— 简单chroot指定用户

对于Linux服务器,有时需要开放登录权限给一部分用户,但并非所有用户都愿意安分守己,也无法知道谁是不安分守己的,给多一个这些用户开放登录权限,系统的威胁就多了一分。 目前来说比较好的方案是chroot,调用了chroot(),就能把的根目录改成指定的根目录。何为根目录?顾名思义,“根”就是所有目录的“根”,一切目录均从“根”而生,没有“根”就没有其他目录,换句话说,“根目录”就是最原始的目录。你无法访问“根”之前前的数据,没有“根”的时候,怎么可以发展数据呢? 二进制程序chroot乃GNU的核心程序中的一个,Linux发行版本一般都有Coreutils,不过二进制版的chroot在这种情况 […]

Read more 1 Comment
C/CPP, PHP

[PHP模块开发]获取单次请求所耗的CPU时间

数天前与一个学校中的朋友闲聊,对方提到了使用Hostker的经历,涉及到了一项“按CPU时间”计费的功能。 个人来说,是挺欣赏这一项收费策略的,毕竟有多少个使用虚拟主机的用户,就有多少种不同资源需求量,按照PHP对CPU资源的使用情况来计费,不仅实现公平收费,还能逼那些让资源占用多的用户占得谨慎点,比用CloudLinux的那些逼格高得多哈!   既然如此,就自己来动手实现一个。 计算CPU时间,并不难实现,Unix Like有提供这一个系统调用,所以嘛,根本不需要你自己计算…… 我所知道相关的系统调用有两个,以下是他们的函数原型: #include <sys/time.h&g […]

Read more No Comments
C/CPP

HDU #1004 Let the Balloon Rise

我只是不想遍历比较那个个字符串数组而已,内存占用可能比较多,不过我相信时间绝对比遍历比较字符串数组要短,CPU占用也少。 不好Free,所以就不手动Free了…… #include <stdio.h> #include <string.h> #include <stdlib.h> struct balloon_index { struct balloon_index *a; struct balloon_index *b; struct balloon_index *c; struct balloon_index *d; struct balloon_ind […]

Read more No Comments
C/CPP

C float类型精确到N位小数的值的比较

博客更换域名后的第一篇文章。 本周,程序设计基础老师布置了一个上机作业,其中一项是一次生成两个零到九的随机数与加减乘除中的一个运算符号,输出两个数的运算式子,让用户输入运算结果,再把用户输入的值与程序运算的结果比较,从而判断用户运算的结果是否正确。 看到这项作业,我担心遇到无理数的时候如何处理,不可能让人也算到那么多位小数吧…… 奇葩的是,老师的给我们的演示截图中恰好没有出现除不尽的情况,不知道是不是特意的?不然我就可以看看老师是偷懒用了整数型还是有高明的算法用浮点型了。   首先想到的是:以数学解决问题 根据多年的人工计算经验,一般都是保留两位小数,因此要求用户输入的数字精确到二位 […]

Read more No Comments
C/CPP, 编程

char **name,char *name[], char name[x][y], char *name[]

疑问: 在给一个函数传递一个运行参数时,不能使用argv+int的形式,必须使用*(argv+int)。 如果argv+int后,地址是字符串首字的地址,那么就不需要取值,而现在需要取值,那就说明argv+int不是字符串首字的地址。既然*(argv+int)所取到的值才是字符串首字的地址,那就说明argv+int的值是一个地址,假设为地址A,地址A中储存的值才是字符串首字的地址。 那二维字符数组(char name[x][y])的一维是否为指针数组?   分析: 创建指针,字符数组 char * pointer; char ** pointer2; char str[] = &#8 […]

Read more No Comments