APUE第三章学习札记

两个进程分别打开同一个文件会产生两个不同的文件表,但是只有一个V节点表。产生不同的文件表的理由是:每个进程对文件都有自己的文件偏移量(我们不应忽略的是:进程中每个文件描述符都可以有自己对各自文件的不同文件偏移量!)。测试代码如下:

#include "apue.h"
#include <fcntl.h>
#include <unistd.h>


int main(void)
{
int fd,pid,fd2;
int returno;
char buf1[] = "abcd";
char buf2[] = "ABCD";


if((fd = open("a.txt",O_CREAT | O_RDWR)) == -1)
{
err_sys("open error");
}
else
{
if((returno = close(fd)) == -1)
{
err_sys("close error");
}


if((pid = fork()) < 0)
err_sys("fork error");
else if(pid == 0)
{
if((fd = open("a.txt", O_RDWR)) == -1)
{
err_sys("open error");
}


if(lseek(fd,10,SEEK_CUR) == -1)
{
err_sys("lseek error");
}

if(write(fd,buf1,4) != 4)
err_sys("write error");

}
else
{
if((fd = open("a.txt", O_RDWR)) == -1)
{
err_sys("open error");
}
if(lseek(fd,1,SEEK_CUR) == -1)
{
err_sys("lseek error");
}


if(write(fd,buf2,4) != 4)
err_sys("write error");

}









if((returno = close(fd)) == -1)
{
err_sys("close error");
}
}

exit (1);


}
结果为:

这个结果表明:父进程在距离文件开头一位处进行输入ABCD,而子进程在距离开头文件十位处进行输入abcd,说明无论是父进程先执行还是子进程先执行,父子进程刚打开文件时的默认偏移量都是开头第一位,并且父子进程的文件偏移量互不影响,它们是对同一个文件进行操作。

利用dup2 进行输出重定向的示例代码如下:

#include "apue.h"
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>




int main(void)
{
int fd,newfd;


if((fd = open("a.txt",O_APPEND | O_RDWR)) == -1)
err_sys("open error");
close(1);
if((newfd = dup2(fd,1)) != 1)
err_sys("dup2 error");
printf("Hello");
exit(1);
}

这个代码的运行结果如下:

可以看到,代码中运行了printf这个函数,这个函数本来默认是将输出的内容输出到终端中,经过前面的输出重定向,将输出重定向到a.txt中间中,所以文件a.txt中输出了Hello而在终端中是没有输出的。

你可能感兴趣的:(dup2,dup,apue,输出重定向,文件表)