c - 成功打开后文件描述符错误

标签 c linux

这似乎是一个非常简单的问题,但我真的不知道这里出了什么问题。我已经编写了一个日志记录函数和一个启动线程的主函数,该线程重复调用该函数。打开调用成功,并且文件描述符在调用写入之前不会损坏。仍然没有写入任何字节,并且 errno 被设置为 BAD FILE DESCRIPTOR。 (为了可读性,我省略了大部分错误检查)

日志功能:

static pthread_once_t once = PTHREAD_ONCE_INIT;
static int logfd;

static void _log_init(void)
{
    int flags = O_CREAT | O_TRUNC | O_APPEND;
    int perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

    logfd = open("log.txt", flags, perms);
}

void log_data(const char *fmt, ...)
{
    int bufsize;
    char *buf;

    pthread_once(&once, _log_init);

    va_list va;

    va_start(va, fmt);
    bufsize = vsnprintf(NULL, 0, fmt, va) + 1;
    va_end(va);

    va_start(va, fmt);
    vsnprintf(buf, bufsize, fmt, va);
    va_end(va);

    if (write(logfd, buf, bufsize) == -1)
        perror("write");

    free(buf);
}

主要功能:

static void *thread_log(void *arg)
{
    int thread = *((int *)arg);
    free(arg);

    for (int i = i; i < 10; ++i)
        log_data("thread %d\n", thread);

    return (void *) NULL;
}

int main()
{
    pthread_t t;
    int *arg;

    arg = malloc(sizeof(int));
    *arg = 1;
    pthread_create(&t, NULL, thread_log, (void *) arg);

    pthread_join(t, NULL);

    return 0;
}

最佳答案

您需要将 O_WRONLY 添加到 open 标志,否则您将无权在此文件描述符上写入。

int flags = O_CREAT | O_TRUNC | O_APPEND | O_WRONLY;

您还需要在此代码上修复一些事情,例如初始化 i(您当前正在执行 int i = i)和 缓冲区

关于c - 成功打开后文件描述符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43571352/

相关文章:

c - 相同的代码在 gcc 编译器和 Turbo C 中返回不同的值

ruby-on-rails - RVM MultiUser 安装不安全?

linux - 如何在 vi 中切换不同的配色方案?

c - 从 C 字符串构建参数列表

c - 在 C 中验证用户输入

linux - 锁定文件或分区以进行读写系统调用

linux - 无法从 Bash 中的命令填充变量

linux - 将 Base64 LDIF 文件转换为纯文本(用于导入)

python - 如何使用 python 在内存中查找 00000000 就像 C 使用 while != 00000000 的方式

c - 移位不适用于变量声明赋值单行