2014-09-01 28 views
7

tôi nhận được một lỗi segmentation với mã này trên fprintf:lỗi segmentation trên thiết bị đầu cuối giả

#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); 
} 

Nhưng nó hoạt động tốt với:

fprintf(stderr, "hello\n"); 

gì đang gây ra điều này?

+2

Bạn đã kiểm tra kết quả của posix_openpt() chưa? – Greycon

+4

fprintf() yêu cầu một TẬP_TIN * không phải là một bộ mô tả tập tin – Carles

+2

Bạn không nên bỏ qua các cảnh báo mà bạn không hiểu ... Đặc biệt nếu dòng tương ứng gây ra sự phân đoạn. – mafso

Trả lời

10

Bạn có segfault, bởi vì fdintfprintf ngoại trừ FILE*.

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

Hãy thử fdopen qua rằng fd:

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

Bạn không có nghĩa là 'fdopen (fd," r + ")'? – ldgabbay

+1

Không chú ý quá nhiều đến 'O_RDWR', vì vậy đó là một sai lầm thuần túy. Cảm ơn bạn. Tôi đã cập nhật câu trả lời của mình. – NoDataFound

+0

Cảm ơn bạn. Nó đã làm việc. – muebau

5

Bạn đang cố gắng để vượt qua những mô tả tập tin (được sử dụng để truy cập tập tin ở mức độ thấp) để fprintf, nhưng nó thực sự cần một cấu trúc FILE, quy định tại stdio.h.

Bạn có thể sử dụng dprintf hoặc fdopen (là POSIX).

+0

mafso: cảm ơn, tôi đã chỉnh sửa câu trả lời của mình! – Jay

+0

Cảm ơn bạn. Nó đã làm việc. – muebau

3

Để ghi ra sử dụng mô tả tệp write(). Lệnh fprintf yêu cầu một con trỏ được nhập 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

Cảm ơn bạn nhưng tôi cần phải sử dụng fprintf(). – muebau

Các vấn đề liên quan