文章分类 - linux C
同步与异步I/O
摘要:同步阻塞IO: 设备IO忙时,内核对发起IO请求的进程说:“现在设备忙,你别走开,在这里等吧,你看IO什么时候做完,做完了你把数据拿走就是了” 发起IO请求的进程说:“好,那我在这等你” 同步非阻塞IO: 设备IO忙时,内核对发起IO请求的进程说:“我已经知道你要IO了,但设备现在有点忙,你回家吧,我会记住你这个事的,我有记录呢,只要设备一空闲我就给你做IO的,做完了给你打电话让你过来拿数据” 发起IO请求的进程说:“IO还没做完呢,我不走,我要不断的问我的IO什么时候完成,知道你把我的IO做完为止” 异步阻塞IO: 设备IO忙时,内核对发起IO请求的进程说:“现在设备忙,你别走开,在这里等吧
阅读全文
stdcall cdecl fastcall thiscall nakedcall的调用方式
摘要:各种函数调用方式详解:函数调用时候参数的传递是通过进程执行的当前栈来进行的。当参数多于一个的时候,参数的压栈顺序如何,且函数执行完成之后参数出栈操作由谁来做,是调用者还是函数自身负责,这些规则形成了不同的函数调用约定。下面分别记录各种函数调用方式的细节问题。函数调用大致分为stdcall cdecl fastcall thiscall和naked call。1.stdcall调用约定:stdcall很多时候被称为pascal调用约定,因为pascal是早期很常见的一种教学用计算机程序设计语言,其语法严谨,使用的函数调用约定就是stdcall。在Microsoft C++系列的C/C++编译器中
阅读全文
粘住位(S_ISVTX)-你懂不?
摘要:文件的文件模式中可以设置一个位,此位为粘住位S_ISVTX。设置了该位表示什么意思了,如果在一个执行文件设置了该位,则执行改文件且进程结束后,系统会把该进程的正文部分放置磁盘的交换区中,在交换区中文件是连续存放的,不像非交换区一样,一个文件的内容分散在磁盘的几个块中。所以在重新启动该执行文件时就可以加快速度启动,直接从交换区中把进程的正文部分取至内存中运行。现今的系统扩展了该位的使用范围,比如说针对目录设置该位,则只有对该用户具有写权限的用户在满足以下条件时才能删除或更名该目录下的文件: (1)拥有此文件; (2)拥有此目录; (3)超级用户权限 在linux中,此扩展功能的应用在/...
阅读全文
进程-文件权限位测试
摘要:进程每次打开、删除一个文件,内核就进行文件访问权限测试,而这种测试可能涉及文件的所有者ID和所属组ID,进程的有效用户ID、有效组ID以及附加组ID。两个所有者ID是文件的性质,而两个有效ID和附加组ID是进程的性质。内核进行的测试顺序如下:(1)若进程的有效用户id为0,则表示为超级用户,则允许访问。(2)如进程的有效用户ID与文件的所有者ID相同,也就是表示进程拥有此文件,则在权限位上文件所有者适当的权限位被设置,进程就可以进行相应的操作,若木有设置,则不允许。(3)若进程的有效用户id不与文件的所有者id相同,但进程的有效组id或附属组id与文件的所属组id相同,则文件的权限位上所属..
阅读全文
缓冲区-延迟写
摘要:传统的unix实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行,当数据写入文件时,内核通常先将数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区一边存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达对首时才进行实际的I/O操作。这种输出方式为延迟写。
阅读全文
文件描述符、i节点
摘要:linux支持在不同进程之间共享打开的文件,linux内核使用三种数据结构表示打开的文件,他们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。(1)每个进程在进程描述符中都有一个记录项,记录项中包有一张打开文件描述符表,每个文件描述符占用一项,与每个文件描述符相关联的是(即每个表项的大致内容): (a)文件描述符标志,即一个整型数; (b)指向文件表项的指针。(2)内核为所有打开文件维持一张文件表。每个文件表项包含: (a)文件状态标志(读、写、添写、同步等); (b)当前文件偏移量; (c)通用i节点表项的指针(创建通用i节点结构的目的是对在一个计算机系统上的多文件...
阅读全文
守护进程
摘要:守护进程是在后台运行不受终端控制的进程(如输入、输出等,一般我们在创建一个进程的时候。系统会自动帮进程打开控制终端的描述符如stdin(标准输入)等,所以我们必须把它关掉才能创建一个守护进程),一般的网络服务都是以守护进程的方式运行的。与后台进程不同的是后台进程拥有控制终端,调试信息什么的还会输出至终端上。守护进程脱离终端的主要由两点: (1)用来启动守护进程的终端在启动守护进程之后,需要执行其他任务。例如其他进程登陆终端后,以前的守护进程的错误信息什么的就不应该出现在终端上; (2)由终端上的一些键所产生的信号不应该对从该终端上生成的守护进程产生影响。 创建守护进程的步骤如下: ...
阅读全文
浅谈进程退出状态
摘要:浅谈进程退出状态在多进程的程序中,我们可以使用函数wait或waitpid在父进程里接收子进程的退出状态,如下面的代码所示:int status;……if (fork() = = 0) // 子进程 { ……exit(0); } else { wait(&status); // 父进程 ……}整型变量status里保存的就是子进程退出时的状态。根据子进程结束的方式,其退出状态分为两种:一、正常退出 二、被信号结束。对于第一种情况,如果子进程的代码里显式调用了函数exit(n)/_exit(n)/return (n)时,status里就包含了值n;否则的话,status里包含的值就等于子
阅读全文
isfdtype()函数
摘要:我们很多时候需要测试某个描述符是不是给定的类型,这就需要用到isfdtype()函数。 #include<sys/stat.h> int isfdtype(int fd,int fdtye); 该函数测试描述符fd是不是fdtype参数指定的类型。为了测试描述符是不是套接字描述符,fdtype参数应该设为S_IFSOCK。例如:isfdtype(sockfd,S_IFSOCK).
阅读全文
fopen /open,read/write和fread/fwrite区别
摘要:fopen /open区别UNIX环境下的C 对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write这里简单的介绍一下他们的区别。1. fopen 系列是标准的C库函数;open系列是 POSIX 定义的,是UNIX系统里的system call。也就是说,fopen系列更具有可移植性;而open系列只能用在 POSIX 的操作系统上。2. 使用fopen 系列函数时要定义一个指代文件的对象,被称为“文件句柄”(file handler),是一个结构体;而open系列使用的是一个被称为“文件描述符” (file descript
阅读全文
浙公网安备 33010602011771号