📅  最后修改于: 2023-12-03 14:55:02.353000             🧑  作者: Mango
在UNIX和类UNIX系统中,文件描述符是在进程执行期间打开的文件的唯一标识符。它是一个非负整数,在进程中代表文件的打开状态,文件描述符0,1和2通常分别用于标准输入,标准输出和标准错误。文件描述符可以打开,读取,写入和关闭文件,以便在系统中进行I/O操作。
要打开文件描述符,可以使用UNIX的open()系统调用。以下是open()函数原型:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *path, int oflag, ...);
open()的第一个参数是要打开的文件的路径,第二个参数是打开标志,它包含以下标志的按位或:
open()返回的值是一个文件描述符,它可以用于后续的I/O操作。
读取和写入文件描述符的操作与常规文件的操作类似。可以使用UNIX的read()和write()系统调用来分别读取和写入文件描述符。以下是这些函数的原型:
#include <unistd.h>
ssize_t read(int fildes, void *buf, size_t nbyte);
ssize_t write(int fildes, const void *buf, size_t nbyte);
read()函数从文件描述符中读取指定数量的字节,并将它们存储在缓冲区中。如果没有错误,它将返回读取的字节数。write()函数将指定数量的字节写入文件描述符。如果没有错误,它将返回已写入的字节数。
当进程使用文件描述符完成操作后,它应该将其关闭。使用UNIX的close()系统调用来关闭文件描述符。以下是close()函数的原型:
#include <unistd.h>
int close(int fildes);
close()函数将指定的文件描述符关闭。如果成功,它将返回0。如果出错,则返回-1。
以下是一个简单的示例,它打开文件“test.txt”,从中读取内容并将其写入stdout:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("test.txt", O_RDONLY);
if (fd < 0) {
perror("open");
return -1;
}
char buf[1024];
ssize_t nread;
while ((nread = read(fd, buf, sizeof(buf))) > 0) {
if (write(STDOUT_FILENO, buf, nread) != nread) {
perror("write");
return -1;
}
}
if (nread < 0) {
perror("read");
return -1;
}
if (close(fd) < 0) {
perror("close");
return -1;
}
return 0;
}
在此示例中,open()打开名为“test.txt”的文件并返回一个文件描述符。然后,程序使用read()函数从文件描述符中读取内容,并使用write()函数将其写入标准输出。在处理完文件后,close()函数关闭文件描述符并结束程序。
文件描述符是UNIX和类UNIX系统中进行I/O操作的重要概念。使用文件描述符,程序员可以打开,读取,写入和关闭文件。这是任何UNIX编程工作中的基本技能。