1.哪些是文件描述符文件描述就是打开文件内核数据结构,返回给用户的一个整数。
#include
#include
#include
#include
#include
#include
int main()
{
int fd = open("./log.txt",O_WRONLY|O_CREAT,0644);
if(fd < 0)
printf("opern");
printf("%dn",fd);
}
我们打开文件会给我打开一个文件描述符,为何会是3呢由于操作系统会给每位进程打开3个文件描述符0.标准输出1.标准输入2.标准错误为了弄清文件描述符的本质,我们须要了解操作系统是如何维护这种文件的linux 文件描述符,你们有没有想过,为何在Linux上一切皆文件,包括显示器和按键都是文件,c盘文件我可以读写,显示器文件可以读写吗,答案是肯定的。下边我会讲解Linux上为何一切皆文件。其实小编不是陡然推测linux 文件描述符,我们接下里就瞧瞧内核源码。
2.哪些是重定向1.输出重定向原本从按键输出,弄成从文件输出。在此之前我须要晓得,Linux开打文件每次都是重最小的位置linux中文乱码,填入。举个反例
#include
#include
#include
#include
#include
#include
int main()
{
close(0);
int fd = open("./log.txt",O_WRONLY|O_CREAT,0644);
if(fd < 0)
printf("opern");
printf("%dn",fd);
}
我们关闭文件描述符0,在创建文件linux内存管理,此时文件描述就是0,了
这就是输出重定向
#include
#include
#include
#include
#include
#include
int main()
{
close(1);
char buf[128];
int fd = open("./log.txt",O_WRONLY|O_CREAT,0644);
printf("%dn",fd);
}
此时原本改复印到屏幕的内容复印到了文件log.txt
dup2的运用
#include
#include
#include
#include
#include
#include
int main()
{
char buf[128];
int fd = open("./log.txt",O_WRONLY|O_CREAT,0644);
dup2(fd,1);
printf("%dn",fd);
}
本应当输出到屏幕的内容,输出到了log.txt
3.子进程和父进程共享文件描述符
#include
#include
#include
#include
#include
#include
#include
int main()
{
if(fork() == 0)
{
int fd = open("./log.txt",O_WRONLY|O_CREAT,0644);
write(fd,"hello wrold",11);
exit(1);
}
waitpid(-1,NULL,0);
char buf[128];
int fd = open("./log.txt",O_RDONLY);
read(3,buf,11);
buf[12] = 0;
printf("%sn",buf);
}
子进程更改了文件log.txt,父进程复印hellowrold4.关于stdin,stdout,strerr我们在FILE这个结构体中可以找到文件描述符、在、usr/include/stdio.h中
那我们可以复印文件描述符
#include
#include
#include
#include
#include
#include
#include
int main()
{
printf("%dn",stdin->_fileno);
printf("%dn",stdout->_fileno);
printf("%dn",stderr->_fileno);
}
所以我们可以看出下层调用最好一定要走系统调用,所以不管哪些软件,程序,都必须要使用系统调用,所以我们一定要学好Linux系统编程