这看起来像是一个非常简单的问题,但我真的无法弄清楚这里出了什么问题。我写了一个日志函数和一个主函数来启动一个重复调用该函数的线程。在写入调用之前打开调用成功并且文件描述符不会损坏。仍然没有字节被写入,并且errno被设置为不良文件描述符。 (我省略了大部分的错误检查readbility)成功打开后的不良文件描述符
记录功能:
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;
}
为了记录,您使用'stdarg.h'作为您的参数列表。文件描述符是使用'fcntl.h'中的'open'函数创建的。然后''从'unistd.h'写入。 打开后文件描述符的值是多少?它在呼叫之间改变吗?当你说它是“损坏的”时,你的意思是它变成无效的,还是它实际上改变了价值? – starturtle