上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 17 下一页
摘要: 1.在 /etc/yum.repos.d/目录下添加google-chrome.repo文件内容如下:32-bit[google-chrome]name=google-chrome - 32-bitbaseurl=http://dl.google.com/linux/chrome/rpm/stable/i386enabled=1gpgcheck=1gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub64-bit[google-chrome]name=google-chrome - 64-bitbaseurl=http://dl 阅读全文
posted @ 2013-06-11 10:41 在于思考 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 在编写简单的c运行库(二)中主要实现了对有关文件操作函数的实现,接下来主要实现有关字符串的函数,如itoa,strcmp,strcpy,strlen函数,这些函数并没有用到系统调用,所以也就不用向实现文件操作的函数那样使用内嵌汇编,这些函数的定义都放在string.h中。实现了字符串函数之后,就大概实现了一个小型的c运行库,虽然很简略,但对于理解c库函数运行原理、所用的关键技术有了比较深刻的认识。最后用这个小的c运行库来编译运行一个简单的测试程序,用以测试我们的库能否正常的工作。1 字符串函数 字符串函数中主要是实现itoa函数有点难度,其它的都还比较的简单,所以这里主要讲下itoa函数... 阅读全文
posted @ 2013-06-07 22:19 在于思考 阅读(1453) 评论(0) 推荐(2) 编辑
摘要: 在前面编写简单的c运行库(一)中主要实现了调用main函数前的初始化、获取参数和环境变量、退出程序等工作。接下来我们真正实现c标准库中的一些函数(主要是文件操作、字符串操作函数)。不过我们对这些函数的实现力争简单,对于效率方面考虑的不是很多,因为目的主要还是学习神秘的库是怎么实现的。1 文件操作 c中的标准I/O库都是带有缓存的,我们在这里为了实现的简单,将缓存省略了,直接包装了有关文件操作的系统调用。现在我们直接看文件打开的函数: 1 static int open(const char *pathname, int flags, int mode) 2 { 3 int ret... 阅读全文
posted @ 2013-06-07 08:56 在于思考 阅读(1406) 评论(0) 推荐(0) 编辑
摘要: 1 进程相关ID 除了进程ID外,与进行相关的ID主要有六个:实际用户ID、实际组ID、有效用户ID、有效组ID、附加组ID、保存的设置用户ID、保存的设置组ID。实际用户ID和实际组ID标识进程是属于谁的。这两个字段在登入时取自口令文件中的登入项。有效用户ID,有效组ID以及附加组ID决定了进程对文件的访问权限。保存的设置用户ID和保存的设置组ID在执行一个程序时包含了有效用户ID和有效组ID的副本。 通常在执行一个程序文件时,进程的有效用户ID通常就是实际用户ID,有效组ID就是实际组ID。在文件模式st_mode中设置一个特殊的标志,其含义是“当执行文件时,将进程的有效用户ID设置为.. 阅读全文
posted @ 2013-06-06 20:55 在于思考 阅读(528) 评论(0) 推荐(0) 编辑
摘要: 看了《程序员自我修养》这本书后,对目标文件、可执行文件的结构有了比较清晰的了解,对目标文件链接成可执行文件的过程和程序运行库有了大致的认识。不过正如“纸上得来终觉浅,绝知此事需恭行”,很多东西看似容易,但实践的时候却往往不是这样,在实践中往往能发现很多的问题。《程序员自我修养》这本书我觉得是理论与实践很好的结合了,它在最后一章给出了一个c和c++运行库的简单版的实现,通过实现这个可以更为深刻地理解可执行文件的结构、程序的执行、运行库的实现。参考这边书,我在linux下实现的一个简单的c运行库,这个运行库主要实现了文件操作、字符串操作、动态内存分配三个方面。1 程序的入口函数实现 当被问到... 阅读全文
posted @ 2013-06-05 21:10 在于思考 阅读(1497) 评论(2) 推荐(2) 编辑
摘要: 本文主要是介绍MSVC命令行参数,对于使用MSVC是很有帮助的。1 cl,MSVC编译器 /c:只编译链接 /Za:禁止语言扩展 /link:链接指定的模块或给链接器传递参数 /Od:禁止优化 /O2:以允许速度最快为目标优化 /O1:以最节省空间为目标优化 /GR或/GR-:开启或关闭RTTI /Gy:开启函数级别链接 /GS或/GS-:开启或关闭 /Fa:输出汇编文件 /E:只进行预处理并且把结果输出 /I:指定头文件包含目录 /Zi:启用调试信息 /LD:编译产生DLL文件 /LDd:编译产生DLL文件(调试版) /MD:与动态多线程版本运行库MSVC... 阅读全文
posted @ 2013-06-01 20:18 在于思考 阅读(1895) 评论(0) 推荐(0) 编辑
摘要: 在c语言中使用变长参数最常见的就是下面两个函数了:int printf(const char *format, ...);int scanf(const char *format, ...); 那他们是怎样实现支持变成参数的呢?在使用变长参数的函数(这里假设是func)实现部分其实用到了std... 阅读全文
posted @ 2013-05-30 21:10 在于思考 阅读(4652) 评论(4) 推荐(3) 编辑
摘要: 1 输入参数传递数组或地址测试代码: 1 #include <stdio.h> 2 3 void foo(char *a) 4 { 5 fprintf(stdout, "%x %x %x\n", &a, a, a[0]); 6 } 7 8 int main ( int argc, char *argv[] ) 9 {10 char a[20] = {'a', 'b', 'c'};11 12 fprintf(stdout, "%x %x %x\n", &a, a, a[0]);13 阅读全文
posted @ 2013-05-30 17:30 在于思考 阅读(1290) 评论(0) 推荐(0) 编辑
摘要: 1 程序的地址空间布局 一个程序在内存中运行,它靠四个东西:代码、栈、堆、数据段。代码段主要存放的就是可执行文件中的代码;数据段存放的就是程序中全局变量和静态变量;堆中是程序的动态内存区域,当程序使用malloc或new得到的内存是来自堆的;栈中维护的是函数调用的上下文,离开了栈就不可能实现函数的调用。在linux中它们的地址空间分布如下: 其中最让我迷惑的还是栈,它是怎么保存程序执行的上下文的?我对它的理解还是保留在数据结构学的栈,什么先进先出,只对栈顶进行操作,对于它的具体应用还真是不太了解。以前写代码就很好奇,当调用一个程序时,栈中到底保留了些什么东西?今天终于有了点理解。2 堆栈帧.. 阅读全文
posted @ 2013-05-28 21:49 在于思考 阅读(5179) 评论(0) 推荐(1) 编辑
摘要: 调用惯例(Calling Convention):函数的调用方和被调用方对于函数如何调用需要有一个明确的约定,只有双方都遵守同样的约定,函数才能被正确的调用。 调用惯例一般会涉及到一下三个方面:1 函数参数传递的顺序与方式 函数传递参数的方式有很多中,可以通过寄存器、栈和内存区域传递,不过最常见的是通过栈传递。函数的调用方先将参数压入栈中,函数自己再从栈中取出参数。对于有多个参数的函数,调用惯例要规定调用方将函数压入栈的顺序:是从左到右,还是从右到左。有些惯例还允许通过寄存器传递参数,以提高性能。2 栈的维护方式 在函数压入栈之后,函数体会被调用,此后需要将被压入栈中的参数全部弹出,以使... 阅读全文
posted @ 2013-05-28 16:51 在于思考 阅读(2497) 评论(0) 推荐(0) 编辑
上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 17 下一页