這看起來像是一個非常簡單的問題,但我真的無法弄清楚這裏出了什麼問題。我寫了一個日誌函數和一個主函數來啓動一個重複調用該函數的線程。在寫入調用之前打開調用成功並且文件描述符不會損壞。仍然沒有字節被寫入,並且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