基础
lstok2009
这个作者很懒,什么都没留下…
展开
-
fread和read的区别,验证fread是带缓存的
fread是c标准库函数(调用read),read是unix系统下的系统调用;fread是带缓存的,read是不带缓存的;验证如下:采用fread一个一个字节读取文件,gdb查看什么时候调用read读取磁盘?#include #include #include int main(){ FILE *file_error = fopen("50M_tv原创 2015-11-10 21:26:16 · 2068 阅读 · 0 评论 -
验证daemon程序中setsid的作用以及重定向stdin、stdout、stderr的原因
daemon程序包括第一次fork、setsid、第二次fork、改变工作目录、关闭所有打开的描述符以及重定向stdin、stdout、stderr。setsid发挥的作用是使得当前进程成为新会话的会话头进程以及新进程组的进程组头进程,从而不再有控制终端。将stdin、stdout和stderr重定向到/dev/null,其中一个原因是打开正常文件占用这些描述符时,诸如perror等之类函原创 2015-11-14 20:57:51 · 1230 阅读 · 0 评论 -
信号驱动式I/O模型,以终端I/O为例写个demo
在实践中有个问题需要注意,设计将标准输入stdin来触发SIGIO信号,但发现标准输出stdout也能触发SIGIO信号,所以O_ASYNC应该是针对设备,而不是描述符。如果在信号处理函数中,采用printf打印会不断触发SEGIO信号,所以改用写文件。代码如下:#include #include #include //for memset#include //for S原创 2015-11-17 07:43:11 · 757 阅读 · 0 评论 -
使用SIGALRM信号为阻塞操作设置超时
我们经常会遇到为阻塞操作设置超时的问题,比如说阻塞套接字read读取设置10秒超时,其中一个办法就是调用alarm函数,它在指定超时时期产生SIGALRM信号,使得阻塞操作中断。但其弊端在于:1、可能干扰进程中现有的alarm调用,如timer、settimer、sleep等。2、在多线程化程序中正确使用信号却非常困难;所以建议只是在未线程化或单线程化的程序中使用本技术。d原创 2015-11-29 22:22:33 · 2434 阅读 · 0 评论 -
内存只有4GB,磁盘却有500GB,内存是如何对应到磁盘内容的呢?
其实每道题都在考一个知识点或多个知识点,这道题到底想考哪个知识点呢?我们知道在linux中写文件可采用write函数、读文件可采用read函数。那么这道题就是考察write和read具体实现细节问题,如何把buf内容写到指定磁盘位置上或从指定磁盘位置上的内容读取到buf中?write函数和read函数的第一个参数是文件描述符fd,那fd是如何找到磁盘位置的?这就涉及到内核用于所有I/O的数据结构了原创 2015-12-19 22:38:16 · 562 阅读 · 0 评论 -
mv到同分区和不同分区是否有区别?
mv到同分区和不同分区是否有区别?比如假设/etc 和 /ext是在不同分区,mv /etc/aaa /etc/bbb 和 mv /etc/aaa /ext/bbb是否有区别。这题考察是mv的具体实现,mv会首先判断是否在同一个文件系统,如果在同一个文件系统中调用rename完成,如果在不同的文件系统采用cp拷贝来完成。这是为什么呢?因为每个文件系统各自对它们的i节点进行编号,原创 2015-12-20 08:50:32 · 964 阅读 · 0 评论 -
求子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值以及子数组的起始和终止下标。要求时间复杂度为O(n)。可采用动态规划的思想,将数组累加值划分成一段一段进行分析,分段规则:累加值小于0时,重新分段;当累加值大于最大值时,更新最大值。示意图:代码:#include原创 2015-12-05 10:26:48 · 455 阅读 · 0 评论