J'utilise la fonction getline() dans le programme ac pour lire les lignes d'un fichier, placer les informations lues dans une structure, créer un thread avec cette structure comme argument, et répéter . Cependant, il getline() renvoie -1 avant l'EOF, après le deuxième ensemble d'arguments sous "id: test2" dans le fichier fourni.
Depuis print errno
dans gdb renvoie 0, je suppose qu'il n'y a pas d'erreur et getline() semble croire qu'il a atteint EOF.
La partie create thread a été mise en commentaire car elle n'a aucun rapport avec le problème rencontré.C getline() renvoie -1 avant EOF
Le code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <sys/time.h>
#define BUFFER_SIZE 256
time_t cur;
char* keypath = "home/chy/.ssh/id_rsa";
int logfreq = 1;
int hashfreq = 180;
struct getArgs
{
const char* id;
const char* hostaddr;
uint16_t port;
const char* uname;
const char* path;
};
int main(int argc, char **argv)
{
int th_max = 5;
int th_count = 0;
pthread_t* ths = (pthread_t*) malloc(th_max * sizeof(pthread_t));
FILE* fp;
fp = fopen("config.txt", "r");
char* line = NULL;
char buf[128];
int r = 0;
size_t len = 0;
ssize_t read;
system("mkdir logs && chmod -R a+r logs");
while(1)
{
pthread_t th;
//Get ID
while((read = getline(&line, &l, fp)) != -1)
{
if(!(read > 0))
continue;
if(sscanf(line, "id: %[^\n]\n", buf) == 1)
break;
if(sscanf(line, "keypath: %[^\n]\n", buf) == 1)
keypath = strdup(buf);
else if(sscanf(line, "logfreq: %d\n", &r) == 1)
logfreq = r;
else if(sscanf(line, "hashfreq: %d\n", &r) == 1)
hashfreq = r;
}
if(read == -1)
break;
struct getArgs* args = (struct getArgs*)malloc(sizeof(struct getArgs));
args->id = strdup(buf);
//Get Host Address
if(getline(&line, &len, fp) == -1)
{
free_args(args);
break;
}
if(sscanf(line, "hostaddr: %[^\n]\n", buf) != 1)
{
free_args(args);
continue;
}
args->hostaddr = strdup(buf);
//Get Port Number
if(getline(&line, &len, fp) == -1)
{
free_args(args);
break;
}
if(sscanf(line, "port: %d\n", &r) != 1)
{
free_args(args);
continue;
}
args->port = r;
//Get Username
if(getline(&line, &len, fp) == -1)
{
free_args(args);
break;
}
if(sscanf(line, "username: %[^\n]\n", buf) != 1)
{
free_args(args);
continue;
}
args->uname = strdup(buf);
//def Path
if(getline(&line, &len, fp) == -1)
{
free_args(args);
break;
}
if(sscanf(line, "path: %[^\n]\n", buf) != 1)
{
free_args(args);
continue;
}
args->path = strdup(buf);
// int err = pthread_create(&th, NULL, &getFiles, args);
if(th_count > th_max)
{
th_max *= 2;
ths = (pthread_t*)realloc(ths, th_max * sizeof(pthread_t));
}
*(ths+th_count * sizeof(pthread_t)) = th;
th_count++;
}
fclose(fp);
while(1);
}
Le fichier:
keypath: /home/username/.ssh/id_rsaNOPASSWORD
id: test1
hostaddr: XXX.XXX.XXX.XXX
port: 22
username: hpc
path: /home/hpc/
id: test2
hostaddr: XXX.XXX.XXX.XXX
port: 22
username: hpc
path: /home/hpc/
id: test3
hostaddr: XXX.XXX.XXX.XXX
port: 22
username: hpc
path: /home/hpc/
id: test4
hostaddr: XXX.XXX.XXX.XXX
port: 3844
username: uname
path: /home/uname/hpc/
Le contenu du pointeur de fichier avant le dernier getline():
{_flags = -72539000,
_IO_read_ptr = 0x7ffff7ff80d0 " \nid: test3\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test4\nhostaddr: XXX.XXX.XXX.XXX\nport: 3844\nusername: uname\npath: /home/uname/hpc/\n\n",
_IO_read_end = 0x401d10 "H\211l$\330L\211d$\340H\215-\277\006 ",
_IO_read_base = 0x7ffff7ff8000 "keypath: /home/username/.ssh/id_rsaNOPASSWORD\n \nid: test1\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test2\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /ho"...,
_IO_write_base = 0x7ffff7ff8000 "keypath: /home/username/.ssh/id_rsaNOPASSWORD\n \nid: test1\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test2\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /ho"...,
_IO_write_ptr = 0x7ffff7ff8000 "keypath: /home/username/.ssh/id_rsaNOPASSWORD\n \nid: test1\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test2\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /ho"...,
_IO_write_end = 0x7ffff7ff8000 "keypath: /home/username/.ssh/id_rsaNOPASSWORD\n \nid: test1\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test2\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /ho"...,
_IO_buf_base = 0x7ffff7ff8000 "keypath: /home/username/.ssh/id_rsaNOPASSWORD\n \nid: test1\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test2\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /ho"..., _IO_buf_end = 0x7ffff7ff9000 "P\220\377\367\377\177", _IO_save_base = 0x0, _IO_backup_base = 0x0, _IO_save_end = 0x0, _markers = 0x0, _chain = 0x7ffff7bbb880, _fileno = 7, _flags2 = 0, _old_offset = 0, _cur_column = 0,
_vtable_offset = 0 '\000', _shortbuf = "", _lock = 0x603120, _offset = -1, __pad1 = 0x0, __pad2 = 0x603130, __pad3 = 0x0, __pad4 = 0x0, __pad5 = 0, _mode = -1, _unused2 = '\000' <repeats 19 times>}
Après:
{_flags = -72538984,
_IO_read_ptr = 0x7ffff7ff8000 "keypath: /home/username/.ssh/id_rsaNOPASSWORD\n \nid: test1\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test2\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /ho"...,
_IO_read_end = 0x7ffff7ff8000 "keypath: /home/username/.ssh/id_rsaNOPASSWORD\n \nid: test1\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test2\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /ho"...,
_IO_read_base = 0x7ffff7ff8000 "keypath: /home/username/.ssh/id_rsaNOPASSWORD\n \nid: test1\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test2\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /ho"...,
_IO_write_base = 0x7ffff7ff8000 "keypath: /home/username/.ssh/id_rsaNOPASSWORD\n \nid: test1\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test2\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /ho"...,
_IO_write_ptr = 0x7ffff7ff8000 "keypath: /home/username/.ssh/id_rsaNOPASSWORD\n \nid: test1\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test2\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /ho"...,
_IO_write_end = 0x7ffff7ff8000 "keypath: /home/username/.ssh/id_rsaNOPASSWORD\n \nid: test1\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test2\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /ho"...,
_IO_buf_base = 0x7ffff7ff8000 "keypath: /home/username/.ssh/id_rsaNOPASSWORD\n \nid: test1\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /home/hpc/\n \nid: test2\nhostaddr: XXX.XXX.XXX.XXX\nport: 22\nusername: hpc\npath: /ho"..., _IO_buf_end = 0x7ffff7ff9000 "P\220\377\367\377\177", _IO_save_base = 0x0, _IO_backup_base = 0x0, _IO_save_end = 0x0, _markers = 0x0, _chain = 0x7ffff7bbb880, _fileno = 7, _flags2 = 0, _old_offset = 0, _cur_column = 0,
_vtable_offset = 0 '\000', _shortbuf = "", _lock = 0x603120, _offset = -1, __pad1 = 0x0, __pad2 = 0x603130, __pad3 = 0x0, __pad4 = 0x0, __pad5 = 0, _mode = -1, _unused2 = '\000' <repeats 19 times>}
J'ai également tenté d'implémenter la même chose avec fgets() au lieu de getline(), mais avec les mêmes résultats.
Qu'est-ce qui pourrait causer ce problème?
Édition:
J'ai exécuté le code sur le même fichier, sauf sans espaces/lignes vides excessives et en changeant l'ordre pour voir si quelque chose est affecté, mais les résultats sont les mêmes.
Je peux également confirmer que la structure de test1 et test2 est correctement remplie.
{id = 0x6032e0 "test1", hostaddr = 0x603300 "XXX.XXX.XXX.XXX", port = 22, uname = 0x603320 "hpc", path = 0x603340 "/home/hpc/"}
{id = 0x603390 "test2", hostaddr = 0x6033b0 "XXX.XXX.XXX.XXX", port = 22, uname = 0x6033d0 "hpc", path = 0x6033f0 "/home/hpc/"}
modifications: changement de version à code et fichier
Où sont déclarées les autres variables? 'keypath',' logfreq', etc. Les globals sont-ils? –
Oui, je les ai édités pour plus de clarté. –
Compilez-vous avec * Avertissements * activé? (c'est-à-dire avec "-Wall -Wextra" dans votre chaîne de compilation?) La raison pour laquelle je vous demande est que vous avez des discordances 'type' signées/unsinged dans vos chaînes' sscanf'). Votre problème avec 'EOF' est très probablement de' sscanf', par ex. 'EOF' est retourné si la fin de l'entrée est atteinte avant que la * première conversion réussie * ou une * erreur de correspondance * se produise. Pour confirmer, placez 'getline' et' sscanf' sur des lignes différentes dans différents tests 'if' à isoler. –