2014-09-01 57 views
7

otrzymuję winy segmentacji z tym kodem na fprintf:winy segmentacji na terminalu pseudo

#define _GNU_SOURCE 

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <time.h> 
#include <sys/time.h> 
#include <unistd.h> 

int fd; 
int main(int argc, char **argv) { 
    fd = posix_openpt(O_RDWR | O_NOCTTY); 

    fprintf(fd, "hello\n"); 

    close(fd); 
} 

Ale to działa dobrze z:

fprintf(stderr, "hello\n"); 

Co jest tego przyczyną?

+2

Czy sprawdziłeś wynik posix_openpt()? – Greycon

+4

fprintf() wymaga FILE * a nie deskryptora pliku – Carles

+2

Nie należy ignorować ostrzeżeń, których nie rozumiesz ... Zwłaszcza jeśli odpowiadająca linia powoduje błąd segfault. – mafso

Odpowiedz

10

Masz błąd segfault, ponieważ fd to int i fprintf z wyjątkiem FILE*.

fd = posix_openpt(O_RDWR | O_NOCTTY); 
fprintf(fd, "hello\n");  
close(fd); 

Spróbuj fdopen nad tym fd:

FILE* file = fdopen(fd, "r+"); 
if (NULL != file) { 
    fprintf(file, "hello\n");  
} 
close(fd); 
+0

Nie masz na myśli 'fdopen (fd," r + ")'? – ldgabbay

+1

Nie zwracano zbyt dużej uwagi na 'O_RDWR', więc jest to czysty błąd. Dziękuję Ci. Zaktualizowałem swoją odpowiedź. – NoDataFound

+0

Dziękuję. Zadziałało. – muebau

5

Próbujesz przekazać deskryptor pliku (używany do dostępu do plików na niskim poziomie), aby fprintf, ale faktycznie potrzebuje struktury FILE, zdefiniowanego w stdio.h.

Można użyć dprintf lub fdopen (które są POSIX).

+0

mafso: dziękuję, zredagowałem moją odpowiedź! – Jay

+0

Dziękuję. Zadziałało. – muebau

3

Aby napisać do deskryptora pliku, należy użyć write(). Komenda fprintf wymaga wskaźnika typowego FILE*.

#define _XOPEN_SOURCE 600 

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <unistd.h> 

int main(void) 
{ 
    int result = EXIT_SUCCESS; 
    int fd = posix_openpt(O_RDWR | O_NOCTTY); 
    if (-1 == fd) 
    { 
    perror("posix_openpt() failed"); 
    result = EXIT_FAILURE; 
    } 
    else 
    { 
    char s[] = "hello\n"; 
    write(fd, s, strlen(s)); 

    close(fd); 
    } 

    return result; 
} 
+0

Dziękuję, ale muszę użyć fprintf(). – muebau