2017-03-24 1 views
0

J'essaye d'écrire une sortie vers un bash fifo pour que je puisse l'envoyer dans un autre programme. Cependant, dès que je l'exécute, j'obtiens une erreur de segmentation . Des pensées? (C amateur ici)Comment écrire correctement à un bash fifo en C?

(errorout dans ce cas une variable globale et est appelé avec succès ailleurs)

void print_log(){ 
    printf("about to creat file pointer"); 
    FILE* image_fifo; 

    printf("open fifo"); 
    image_fifo = fopen("image",O_WRONLY); 

    if(image_fifo == NULL){ 
     printf("unable to open fifo"); 
    }//end if 

    else{ 
     printf("writing to fifo"); 
     int j; 
     for(j=0;j<1024;j++){ 
     fprintf(image_fifo,"%u",errorout[j]); 
     }//end for 
    } 
    fclose(image_fifo); 

pour l'instant, le lire à l'aide de ceci: (? Python est pas super)

with open("image","r") as f: 
    print(f.read()) 
+0

Avez-vous une autre sortie en plus de la segfault? – mgarey

+4

Qu'est-ce qu'un 'bash fifo'? En quoi est-ce différent d'un fifo régulier? –

+4

'fopen (" image ", O_WRONLY);' est faux. 'fopen' prend un char * pour son second argument. –

Répondre

0

Je pense que la faute de segmentation est causée par ceci:

image_fifo = fopen("image",O_WRONLY); 

Ceci est pour appeler le système Linux de style open() de sys/stat.h (ou fcntl.h), où le second paramètre est un int qui indique des drapeaux (et O_WRONLY est en effet défini à une valeur int dans le fichier d'en-tête). Dans C fopen() de stdio.h, vous faites cela avec un char *, par ex. fopen("name", "w");.

Pour être sûr que la prochaine fois comprendra tout ce que le programme imprime avant de terminer. Vous pourriez également vouloir regarder la production de valgrind; Cela pourrait vous donner des indices sur ce qui ne va pas. Comme pour "bash style fifo", je ne suis pas sûr de ce que vous essayez de faire, mais si vous essayez juste d'écrire dans un fichier, vous le faites presque correctement. Si vous essayez de faire un pipeline (j'ai entendu quelqu'un les appeler aussi fifo, donc peut-être le cas), vous devriez regarder la bibliothèque libpipeline et son utilisation.

+0

bash fifo, ou plus exactement 'named pipe', est créé en utilisant des utilitaires comme' mkfifo' ou 'mknod'. – alvits