摘要: Historically, a C program has been composed of the following pieces:Text segment, the machine instructions that the CPU executes. Usually, the text segment is sharable so that only a single copy needs to be in memory for frequently executed programs, such as text editors, the C compiler, the shells, 阅读全文
posted @ 2012-10-23 15:19 beanmoon 阅读(256) 评论(0) 推荐(0)
摘要: volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错。例如:volatile int i=10;int j = i;...int k = i;volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volat 阅读全文
posted @ 2012-10-23 15:18 beanmoon 阅读(217) 评论(0) 推荐(0)
摘要: register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。例如下面的内存块拷贝代码, #ifdef NOSTRUCTASSIGN memcpy(d, s, l) {register char *d; register char *s; register int i; while (i--) *d++ = *s++; } #endif 但是使用register修饰符有几点限制。 首先,register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或... 阅读全文
posted @ 2012-10-23 15:17 beanmoon 阅读(414) 评论(0) 推荐(0)
摘要: #include "apue.h"#include <sys/types.h>#include <utime.h>int main(){ struct utimbuf tbuf; // both type of tbuf.actime and time() is time_t, // but why can't this assignment happen? tbuf.actime = time(); tbuf.modtime = time(); if(utime("hello.c", &tbuf) < 0) 阅读全文
posted @ 2012-10-20 18:57 beanmoon 阅读(147) 评论(0) 推荐(0)
摘要: 1. Google&Wiki(遇到问题做的第一件事情,也是学习某个东西做功课(homework)最先用到的东西。2. 看书挑剔,只看经典。如何选择经典,可以到网上做做功课,看看评价,综合分析一下。3. 做读书笔记。一是将自己阅读的时候的思考(包括闪念)总结下来,二是将书中的好例子摘抄下来。(这个习惯是一年前才养成的,发现受益极大。)有了google note,笔记可以加上tag,非常便于回顾,加深理解。我觉得,人与人学习的差距不在资质上,而在花在思考的时间和思考的深度上(后两者常常也是相关的)。4. 提到思考,我有一个小习惯。利用走路和吃饭的时候思考,还有睡觉前必然要弄一个问题放在脑子 阅读全文
posted @ 2012-10-20 17:28 beanmoon 阅读(290) 评论(0) 推荐(0)
摘要: //第一次把apue的课后习题做出来了,以作纪念。 PS:这个程序的运行时间比figure4.22的运行时间多,大概是由于切换当前工作目录引起的吧#include "apue.h"#include <dirent.h>#include <limits.h>//line9-54 is copied from figure2.15#ifdef PATH_MAXstatic int pathmax = PATH_MAX;#elsestatic int pathmax = 0;#endif#define SUSV3 200112Lstatic long po 阅读全文
posted @ 2012-10-20 17:15 beanmoon 阅读(319) 评论(0) 推荐(0)
摘要: df 命令:通过文件系统中未分配的空间来确定文件系统中已分配空间的大小。例如:如果一个文件系统中有 8192个512-byte 块, 并且4096 个块没有被分配出去,那么已分配的空间就是4096 个512-byte 的块。已分配空间 = 空间总数 - 未分配空间因为基于文件系统总体来计算,所以df 命令是报告文件系统空间使用情况最可靠的命令。du 命令:是面向文件的命令,它计算分配给指定文件或者目录的空间。 du 命令必须跟着目的参数,而且不能隔离文件系统。例 如:运行 “# du /” 命令将计算所有在 / 文件系统下所有文件的空间分配信息。其中包括 / 文件系统所有的文件和安装在 / 下 阅读全文
posted @ 2012-10-20 12:56 beanmoon 阅读(1088) 评论(0) 推荐(0)
摘要: //程序可以正常运行,但file.nohole始终没有东西写进去,为什么?#include "apue.h"#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int main(int argc, char *argv[]){ FILE *fp1, *fp2; char chr; int fd, count = 0; if(argc != 3) err_quit("Usage: %s <src> <dest>", argv[0 阅读全文
posted @ 2012-10-20 11:54 beanmoon 阅读(153) 评论(0) 推荐(0)
摘要: #include <unistd.h>pid_t fork(void);由fork创建的新进程为子进程。fork函数被调用一次,但返回两次,两次返回的唯一区别是子进程的返回值为0,而父进程的返回值则是新子进程的进程ID。将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID。fork使子进程得到返回值为0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid以获得父进程的进程ID(进程ID 0总是由内核交换进程使用,所以一个子进程的进程ID不可能是0)子进程是父进程的副本。子进程获得父进程数据空间 阅读全文
posted @ 2012-10-20 11:15 beanmoon 阅读(522) 评论(0) 推荐(0)
摘要: 1、已知文件流指针,获取对应的文件描述符int fileno(FILE *stream); 主要应用:如果程序先前用fopen打开了一个文件,但是又想对其进行锁定操作, 例如 int fcntl(int fildes, int command, struct flock *flock_structure)(注意:command为F_GETLK, F_SETLK, F_SETLKW中其中一者) 或者 int lockf(int fd, int cmd, off_t len),就得先用fileno得到对应的文件描述符后再进行fcntl/lockf操作。2、已知文件描述符,获取对应的文件流指针 FI 阅读全文
posted @ 2012-10-20 11:15 beanmoon 阅读(1322) 评论(0) 推荐(0)