首页 > 编程知识 正文

linux的exec命令,linux用户文件描述符0表示

时间:2023-05-06 16:17:29 阅读:170656 作者:3461

文件描述符是什么

文件描述符在形式上是非负整数。 实际上,它是指向内核为每个进程维护的进程打开的文件的记录表的索引值。 当程序打开现有文件或创建新文件时,内核会向进程返回文件描述符。 在编程中,基本编程经常围绕文件描述符展开。 但是,文件描述符这个概念大多只适用于UNIX和Linux这样的操作系统。

通常,“标准输入”的文件描述符为0,“标准输出”为1,“标准错误”为2。 虽然此习惯不是Unix内核的特性,但由于shell和许多APP应用程序都使用此习惯,因此如果内核不遵循此习惯,许多APP应用程序将无法使用。

POSIX定义了STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO来代替0、1和2。 这三个符号常数的定义位于头文件unistd.h中。

文件描述符的有效范围为0到OPEN_MAX。 通常,每个进程最多可以打开64个文件(0-63 )。 对于FreeBSD 5.2.1、Mac OS X 10.3和Solaris 9,每个进程可以打开的最大文件数取决于系统内存大小、int大小和系统管理员设置的限制。 Linux 2.4.22强制规定最多不能超过1,048,576。

文件描述符是一个由无符号整数表示的句柄,进程用于标识打开的文件。 文件描述符与包含相关信息的文件对象相关联,例如文件打开模式、文件位置类型和文件初始类型。 这些信息称为文件上下文。

如何创建文件描述符

进程获取文件描述符的最常见方法是从本地子例程open或create中获取,或者从父进程继承。 通过后一种方法,子进程也可以访问父进程使用的文件。 文件描述符对于每个进程通常是唯一的。 当您使用fork子程序创建子流程时,子流程会获取父流程的所有文件描述符的副本,这些文件描述符将在fork运行时打开。 从fcntl、dup或dup2子程序复制或复制流程时,也会发生相同的复制流程。

对于每个进程,操作系统内核都会在u_block结构中维护一个文件描述符表,所有文件描述符都会在该表中创建索引。

文件描述与文件指针一致的差异

文件描述符:在linux系统上,设备也作为文件存在,必须先打开文件才能使用设备。 打开文件可获得文件描述符。 这是一个小正整数。 每个进程都在进程控制块(PCB )中保存一个文件描述符表。 文件描述符是此表的索引,每个表条目都有一个指向打开文件的指针。 文件描述符的优点:与POSIX标准兼容,并且许多Linux和UNIX系统调用都依赖于此。 文件描述符的缺点:不能移植到非UNIX系统,也不直观。

文件指针:在c语言中,使用文件指针而不是文件描述符作为I/O句柄。 文件指针是进程用户区域中的一个称为文件结构的数据结构。 文件结构包含缓冲区和文件描述符。 因为文件描述符是文件描述符表的索引,所以文件指针在某种意义上是句柄的句柄。 在Windows系统上,文件描述符称为文件句柄。 在FILE *中,除了fd信息之外,还包含IO缓冲器,因为是c标准形式,所以FILE *比fd更适合于跨平台,应该多使用fopen,少使用open。

c语言文件指针和文件描述符可以相互转换

这必须通过fdopen和fileno两个函数来实现。 包含在头文件stdio.h中。

fdopen原型: file*fdopen(intfiledes,const char *opentype );

第一个参数filedes是打开的文件描述符,opentype是表示打开方式的字符串,其值与fopen函数(如" w "和" w " )相同。 但是,必须保证该字符串的说明和文件的实际打开方式一致。 函数fopen ) )是返回打开文件的指针。 如果操作失败,则返回空指针。

将文件流指针转换为文件描述符的fileno函数。 原型如下。

int fileno (文件*流);

返回与流文件流对应的文件描述符。 失败时返回-1。

程序运行时,将打开三个文件流:标准输入stdin、标准输出stdout和标准错误输出stderr。 对应于流文件,还预先打开了表示标准输入、标准输出和标准错误输出的0、1、2三个文件描述符。

称赞

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。