IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux 文件描述符与重定向 -> 正文阅读

[系统运维]Linux 文件描述符与重定向

1.什么是文件描述符

文件描述就是打开文件内核数据结构,返回给用户的一个整数。

 #include<stdio.h>
 #include<stdlib.h>
 #include<sys/types.h>
 #include<sys/stat.h>
 #include<unistd.h>

 #include <fcntl.h>
 int main()
 {
         int fd = open("./log.txt",O_WRONLY|O_CREAT,0644);
         if(fd < 0)
                 printf("opern");
         printf("%d\n",fd);
 }

我们打开文件会给我打开一个文件描述符,为什么会是3呢

因为操作系统会给每个进程打开3个文件描述符

0.标准输出 1.标准输入 2.标准错误

为了弄清文件描述符的本质,我们需要了解操作系统是怎么维护这些文件的,

大家有没有想过,为什么在Linux上一切皆文件,包括显示器和键盘都是文件,磁盘文件我可以读写,显示器文件可以读写吗,答案是肯定的。下面我会讲解Linux 上为什么一切皆文件。当然小编不是凭空猜测,我们接下里就看看内核源码。

2.什么是重定向

1.输出重定向

本来从键盘输出,变成从文件输出。

在此之前我需要知道,Linux 开打文件每次都是重最小的位置,填入。举个例子

 #include<stdio.h>
 #include<stdlib.h>
 #include<sys/types.h>
 #include<sys/stat.h>
 #include<unistd.h>

 #include <fcntl.h>
 int main()
 {
         close(0);
         int fd = open("./log.txt",O_WRONLY|O_CREAT,0644);
         if(fd < 0)
                 printf("opern");
         printf("%d\n",fd);
 }

?

我们关掉文件描述符0,在创建文件,此时文件描述就是0,了

这就是输出重定向

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>

#include <fcntl.h>
int main()
{
        close(1);
        char buf[128];
        int fd = open("./log.txt",O_WRONLY|O_CREAT,0644);
        printf("%d\n",fd);
}

?此时本来改打印到屏幕的内容打印到了文件log.txt

?dup2的运用

 #include<stdio.h>
 #include<stdlib.h>
 #include<sys/types.h>
 #include<sys/stat.h>
 #include<unistd.h>

 #include <fcntl.h>
 int main()
 {
         char buf[128];
         int fd = open("./log.txt",O_WRONLY|O_CREAT,0644);
         dup2(fd,1);
         printf("%d\n",fd);
 }

本应该输出到屏幕的内容,输出到了log.txt

?3.子进程和父进程共享文件描述符

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<wait.h>
#include <fcntl.h>
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("%s\n",buf);
}

?子进程修改了文件log.txt,父进程打印hello wrold

4.关于stdin,stdout,strerr

我们在FILE这个结构体中可以找到文件描述符、在、usr/include/stdio.h中

?那我们可以打印文件描述符

 #include<stdio.h>
 #include<stdlib.h>
 #include<sys/types.h>
 #include<sys/stat.h>
 #include<unistd.h>
 #include<wait.h>
 #include <fcntl.h>
 int main()
 {
         printf("%d\n",stdin->_fileno);
         printf("%d\n",stdout->_fileno);
         printf("%d\n",stderr->_fileno);
 }

?所以我们可以看出上层调用最好一定要走系统调用,所以不管什么软件,程序,都必需要使用系统调用,所以我们一定要学好Linux系统编程

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 23:07:00  更:2022-04-07 23:09:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 21:22:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码