C: 多个 pthread 期间的 fgets 错误
C: fgets error during multiple pthread
我的程序的总体目标是从文件中读取数据(浮点数或字母)并使用互斥锁更改我的全局常量。 (到现在还没申请)
但在此之前,我只是想创建一个基本程序来读取文件的全部内容并打印到屏幕上。
目前,我的程序无法这样做。它只是读取文件的第一个字符并退出文件。
我正在提供我的代码以及错误。任何帮助都会很有帮助。
#include <stdio.h>
#include <pthread.h>
#include <string.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
char *files[] = {"one.in", "two.in", "three.in", "four.in", "five.in"};
void* thread( void * arg )
{
char * file = (char *) arg;
// open the file and read the content
FILE *fp = fopen(file,"r");
char line[1024];
int len;
printf("Thread id is %s enter\n",file);
if( !fp)
{
printf("%s file open failed\n", file);
return 0;
}
else
printf("%s File open success %p %d\n", file, fp, ftell(fp));
// dump the file content with thread id (file name)
while (fgets(line,len, fp))
{
printf("%s %s", file, line);
}
printf("Thread id is %s %d exit\n",file, ftell(fp));
fclose(fp);
return 0;
}
int main( void )
{
int i = 0;
if (pthread_mutex_init(&mutex, NULL) != 0)
{
printf("\n mutex init failed\n");
return 1;
}
for(i = 4; i >= 0; i--)
{
pthread_t id;
pthread_create( &id, NULL, &thread, files[i] );
pthread_detach(id);
}
printf("Main thread exit\n");
pthread_exit(0);
printf("Main thread real exit\n");
return 0;
}
错误
Thread id is five.in enter
five.in File open success 0x7fff7a2e7070 0
Thread id is five.in 0 exit
Thread id is four.in enter
four.in File open success 0x7fff7a2e7070 0
Thread id is four.in 0 exit
Thread id is three.in enter
three.in File open success 0x7fff7a2e7070 0
Thread id is three.in 0 exit
Thread id is two.in enter
two.in File open success 0x7fff7a2e7070 0
Thread id is two.in 0 exit
Thread id is one.in enter
one.in File open success 0x7fff7a2e7070 0
Thread id is one.in 0 exit
Main thread exit
文件格式
R
1
2
3
-4
-5
4
W
问题是对 fgets()
的调用:
while (fgets(line,len, fp))
len
未初始化。这在技术上是 undefined behaviour.
你想要的是使用line
的大小:
while (fgets(line, sizeof line, fp))
我的程序的总体目标是从文件中读取数据(浮点数或字母)并使用互斥锁更改我的全局常量。 (到现在还没申请)
但在此之前,我只是想创建一个基本程序来读取文件的全部内容并打印到屏幕上。
目前,我的程序无法这样做。它只是读取文件的第一个字符并退出文件。
我正在提供我的代码以及错误。任何帮助都会很有帮助。
#include <stdio.h>
#include <pthread.h>
#include <string.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
char *files[] = {"one.in", "two.in", "three.in", "four.in", "five.in"};
void* thread( void * arg )
{
char * file = (char *) arg;
// open the file and read the content
FILE *fp = fopen(file,"r");
char line[1024];
int len;
printf("Thread id is %s enter\n",file);
if( !fp)
{
printf("%s file open failed\n", file);
return 0;
}
else
printf("%s File open success %p %d\n", file, fp, ftell(fp));
// dump the file content with thread id (file name)
while (fgets(line,len, fp))
{
printf("%s %s", file, line);
}
printf("Thread id is %s %d exit\n",file, ftell(fp));
fclose(fp);
return 0;
}
int main( void )
{
int i = 0;
if (pthread_mutex_init(&mutex, NULL) != 0)
{
printf("\n mutex init failed\n");
return 1;
}
for(i = 4; i >= 0; i--)
{
pthread_t id;
pthread_create( &id, NULL, &thread, files[i] );
pthread_detach(id);
}
printf("Main thread exit\n");
pthread_exit(0);
printf("Main thread real exit\n");
return 0;
}
错误
Thread id is five.in enter
five.in File open success 0x7fff7a2e7070 0
Thread id is five.in 0 exit
Thread id is four.in enter
four.in File open success 0x7fff7a2e7070 0
Thread id is four.in 0 exit
Thread id is three.in enter
three.in File open success 0x7fff7a2e7070 0
Thread id is three.in 0 exit
Thread id is two.in enter
two.in File open success 0x7fff7a2e7070 0
Thread id is two.in 0 exit
Thread id is one.in enter
one.in File open success 0x7fff7a2e7070 0
Thread id is one.in 0 exit
Main thread exit
文件格式
R
1
2
3
-4
-5
4
W
问题是对 fgets()
的调用:
while (fgets(line,len, fp))
len
未初始化。这在技术上是 undefined behaviour.
你想要的是使用line
的大小:
while (fgets(line, sizeof line, fp))