因为这是我自己写的肯定会有不足甚至可能错误的地方,如有请各位阅读者指正,可以的话请您直接在博客下面留言,我方便改正.
3.1
当读/写磁盘文件时,本章中描述的函数确实是不带缓冲机制的吗?请说明原因。
实际是带有缓冲机制的,
1. 如read的时候,大多数的文件系统为改变性能都采用某种预读(read ahead)技术,
当检测到正在进行顺序读取时,系统就试图读入比应用所要求的更多数据.
2. 通常write只是将数据排入队列,而实际的写磁盘操作则可能在以后的某个时刻进行。
而数据库系统则需要使用O_SYNC,这样一来当它从write返回时就知道数据已确实写到磁盘上,
以免在系统异常是产生数据丢失
3.2
编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理
/*
* 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理
* If oldfd is not a valid file descriptor, then the call fails, and newfd is not closed.
* If oldfd is a valid file descriptor, and newfd has the same value as oldfd,
* then dup2() does nothing, and returns newfd.
*/
#include <unistd.h>
#include <stdio.h>
int mydup2(int oldfd, int newfd);
int main(void)
{
int fd = 0;
const int newfd = 10;
fd = mydup2(1, newfd);
if (newfd == fd)
printf("mydup2 ok\n");
return 0;
}
int mydup2(int oldfd, int newfd)
{
int fd = 0;
int beginfd = 0;
int ret = -1;
int i = 0;
/* Invalid file descriptor */
if (oldfd < 0 || newfd < 0)
{
printf("oldfd and newfd must be non-negative integers\n");
goto EXIT;
}
/* newfd == oldfd, returns newfd */
if (oldfd == newfd)
{
ret = newfd;
goto EXIT;
}
/* newfd != oldfd, close newfd and assign oldfd to newfd */
close(newfd);
fd = dup(oldfd);
beginfd = fd;
while(1)
{
printf("fd=%d\n",fd);
if (newfd == fd)
break;
sleep(1);
fd = dup(oldfd);
}
/* close file descriptor that open by dup() and doesn't equal newfd */
for (i=beginfd; i!=newfd; ++i)
{
printf("i=%d\n", i);
close(i);
}
ret = newfd;
EXIT:
return ret;
}