这似乎是一个非常简单的问题,但我真的不知道这里出了什么问题。我已经编写了一个日志记录函数和一个启动线程的主函数,该线程重复调用该函数。打开调用成功,并且文件描述符在调用写入之前不会损坏。仍然没有写入任何字节,并且 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/