如何在C中获取打开的fd的标志



我想得到fd的标志之前在C中打开过。

但我使用fcntl手册页的fcntl(fd,F_GETFD,0)引用,它总是返回1给我。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define XSZ(x) (int)(sizeof(x)*2)
int main()
{
    int ret;
    static const char str [] = "hello c program!n";
    int fd = open("test.txt", O_RDWR | O_APPEND | O_CREAT, 0777);
    if(fd < 0)
    {
        perror("open");
        return -1;
    }
    printf("fd = %dn", fd);
    ret = fcntl(fd, F_GETFD, 0);
    printf("flag:%dn",ret);
    write(fd, str, strlen(str)-1);
    return 0;
}

它总是打印:

fd = 3
flag:1

我认为ret是O_RDWR | O_APPEND | O_CREAT 的总和

您应该使用F_GETFL而不是F_GETFD。还记得用八进制打印进行比较。

一件重要的事情是并非所有的标志都由fcntl返回。只记住访问模式标志,如O_RDWR。但是O_CREATE/O_TRUNC等是操作模式或打开时间标志,系统不会记住这些标志,因此不会返回。

这是您修改后的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define XSZ(x) (int)(sizeof(x)*2)
int main()
{
    int ret;
    int fd = open("test.txt", O_RDWR | O_APPEND | O_CREAT, 0777);
    if(fd < 0)
    {
        perror("open");
        return -1;
    }
    printf("fd = %dn", fd);
    ret = fcntl(fd, F_GETFL);
    perror("fcntl");
    printf("flag:%on",ret);
    printf("flag:%on",O_RDWR|O_APPEND);
    write(fd, "hello c programn", strlen("hello c program!n"));
    return 0;
}

这是上面代码的输出

fd = 3
fcntl: Success
flag:102002
flag:2002

F_GETFD不查询打开的标志,而只查询FD_CLOEXEC(请参阅此处(。

线路

write(fd, "hello c programn", strlen("hello c program!n"));

是错误的,因为您查询的字符串长度比您写入的字符串长,可能会导致缓冲区溢出。一种更安全、更有效的方法是:

static const char str [] = "hello c program!n";
write(fd, str, sizeof(str)-1);

需要-1来避免写入终止的0字节。

我不知道的目的

#define XSZ(x) (int)(sizeof(x)*2)

但是将size_t(sizeof()的结果类型(转换为int可能不是一个好主意。

相关内容

  • 没有找到相关文章

最新更新