📜  文件描述符 bash - Shell-Bash (1)

📅  最后修改于: 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()的第一个参数是要打开的文件的路径,第二个参数是打开标志,它包含以下标志的按位或:

  • O_RDONLY:以只读方式打开文件
  • O_WRONLY:以只写方式打开文件
  • O_RDWR:以读写方式打开文件
  • O_CREAT:如果文件不存在,则创建该文件
  • O_EXCL:与O_CREAT一起使用,如果文件已经存在,则出错
  • O_APPEND:以追加方式打开文件

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编程工作中的基本技能。