1 程序是为了完成特定的任务而准备好的一个指令序列。
2 进程是一个正在执行的程序实例。每个实例都有自己的地址空间和执行状态。
程序转化为进程:操作系统为进程分配进程ID,和进程的执行状态。用这些信息来为进程分配和管理系统资源。
3 程序映像:加载以后,可执行程序看起来占据了一个连续的内存块,这个连续的内存块被称为程序映像。
程序映像看起来占据了一个连续的内存块,但实际上,操作系统将程序映像映射到不一定连续的物理内存块中。
通常的映射将程序映像划分为相同大小的片,这些片被称为页。
操作系统将这些页加载到内存中,当处理器引用某页上的内存时,操作系统会从一个表中查找这一页的物理位置。
4 显示错误的库函数的使用,推荐用strerror。但是strerror调用后可能会改变errno的值。,如果之后还要用errno,则要先保存。
进程被信号中断时,错误不是由它执行中的问题造成的,而是由外部因素造成的。应该重启这个调用。如下:
//close失败后,用strerror输出信息
int fildes;
if (-1 == close(fildes))
fprintf(stderr, "Failed to close file descriptor %d: %s/n",fildes, strerror(errno));
//调用strerror前保持errno的值
int fildes;
int error;
if (-1 == close(fildes))
{
error = errno;
fprintf(stderr, "Failed to close file descriptor %d: %s/n",fildes, strerror(errno));
errno = error;
}
//如果是中断,则重启调用close,直到执行成功或遇到真正的错误为止
int fildes;
int error;
while(((error = close(fildes))==-1)&&(error==EINTR))
int fildes;
if (-1 == close(fildes))
fprintf(stderr, "Failed to close file descriptor %d: %s/n",fildes, strerror(errno));
//调用strerror前保持errno的值
int fildes;
int error;
if (-1 == close(fildes))
{
error = errno;
fprintf(stderr, "Failed to close file descriptor %d: %s/n",fildes, strerror(errno));
errno = error;
}
//如果是中断,则重启调用close,直到执行成功或遇到真正的错误为止
int fildes;
int error;
while(((error = close(fildes))==-1)&&(error==EINTR))
;
if (-1 == close(fildes))
{
error = errno;
fprintf(stderr, "Failed to close file descriptor %d: %s/n",fildes, strerror(errno));
errno = error;
}
if (-1 == close(fildes))
{
error = errno;
fprintf(stderr, "Failed to close file descriptor %d: %s/n",fildes, strerror(errno));
errno = error;
}
//重启库的close版本
#include "restart.h"
int fildes;
int error;
while(((error = r_close(fildes))== -1))
{
error = errno;
fprintf(stderr, "Failed to close file descriptor %d: %s/n",fildes, strerror(errno));
errno = error;
}
#include "restart.h"
int fildes;
int error;
while(((error = r_close(fildes))== -1))
{
error = errno;
fprintf(stderr, "Failed to close file descriptor %d: %s/n",fildes, strerror(errno));
errno = error;
}
5 main函数终止。
使用main中的return语句等价于用相应的状态调用exit。
执行到main的末尾与调用exit(0)的效果相同
_Exi和_exit函数在终止控制之前没有调用用户定义的退出处理程序。即打开的流是否被flush或者临时文件是否被删除是未知的。