2011-07-24 17 views
6

Tôi đang cố sử dụng chuyển hướng trong C để chuyển hướng đầu vào đến một tệp và sau đó đặt đầu ra chuẩn thành in ra màn hình. Ai đó có thể cho tôi biết những gì sai với mã này?chuyển hướng đầu ra tiêu chuẩn bằng c sau đó đặt lại đầu ra tiêu chuẩn

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 

int main(int argc, char** argv) { 
    //create file "test" if it doesn't exist and open for writing setting permissions to 777 
    int file = open("test", O_CREAT | O_WRONLY, 0777); 
    //create another file handle for output 
    int current_out = dup(1); 

    printf("this will be printed to the screen\n"); 

    if(dup2(file, 1) < 0) { 
     fprintf(stderr, "couldn't redirect output\n"); 
     return 1; 
    } 

    printf("this will be printed to the file\n"); 

    if(dup2(current_out, file) < 0) { 
     fprintf(stderr, "couldn't reset output\n"); 
     return 1; 
    } 

    printf("and this will be printed to the screen again\n"); 

    return 0; 
} 
+1

Có cách hoàn toàn khác để giải quyết vấn đề tương tự ở đây: http://stackoverflow.com/questions/584868/rerouting-stdin-and-stdout-from-c. – Sam

Trả lời

3

thứ hai dup2 Cuộc gọi của bạn là sai, thay bằng:

if (dup2(current_out, 1) < 0) { 
4

Một điều bạn sẽ phải chắc chắn để làm trước đó sẽ làm việc ở tất cả, là để gọi fflush(stdout); trước khi chuyển sang các mô tả stdout tập tin ra từ dưới nó. Điều có thể xảy ra là thư viện chuẩn C đang lưu trữ dữ liệu đầu ra của bạn, không biết rằng bạn đang di chuyển xung quanh các bộ mô tả tệp bên dưới nó. Dữ liệu bạn viết bằng cách sử dụng printf() không phải là thực tế được gửi đến bộ mô tả tệp cơ bản cho đến khi bộ đệm của nó đầy (hoặc chương trình của bạn trả về từ main).

Chèn cuộc gọi như thế này:

fflush(stdout); 
    if(dup2(file, 1) < 0) { 

trước cả các cuộc gọi đến dup2().

+0

Tôi không nghĩ rằng đây là vấn đề của OP ở đây, nhưng đó là lời khuyên rất tốt và hầu như luôn luôn được theo dõi bất cứ khi nào bạn trộn stdio với tập tin mô tả io. –

+1

Đó là sự thật, tôi thực sự đã không nhận thấy các mô tả tập tin không chính xác lúc đầu cho đến khi ai đó khác đề cập đến nó. Khi ghi vào một thiết bị đầu cuối, đầu ra stdio có lẽ sẽ là dòng đệm, vì vậy mã không có 'fflush()' có khả năng hoạt động cho đến khi OP thử chuyển hướng stdout thành một tệp. –

1

Chỉ cần thay thế dup2(current_out, file) với dup2(current_out, 1), và những điều nên làm việc tốt hơn.