2013-08-16 95 views
11

Tôi tò mò như thế nào printf hoạt động bên trong Linux. Tôi không hiểu cách ghi dữ liệu vào STDOUT.Printf hoạt động như thế nào?

Sau một chút tìm kiếm các internals, tôi đã tải về glibc và đã xem xét mã nguồn:

__printf (const char *format, ...) 
{ 
    va_list arg; 
    int done; 

    va_start (arg, format); 
    done = vfprintf (stdout, format, arg); 
    va_end (arg); 

    return done; 
} 

Sau khi tìm thấy điều này, tôi đã đi sâu hơn vào vfprintf chức năng - nhưng tập tin là khoảng 2500 các dòng mã C không quen thuộc. Tôi đang tìm một lời giải thích từ 10.000 feet về cách printf làm việc với bộ nhớ của máy tính và đầu ra để hiển thị các ký tự trên màn hình.

Nếu tôi là một đoạn mã lắp ráp, tôi sẽ phải làm gì để hoàn thành nhiệm vụ tương tự? Hệ điều hành có phụ thuộc không?

+0

Tất cả đều viết xuống để viết vào một thiết bị (gần như thể đó là một tệp). Trình điều khiển thiết bị tiếp quản và diễn giải các giá trị ASCII và báo cho màn hình cách hiển thị chúng. Tương tự với đĩa, chuột, v.v. – Jiminion

+0

không, anh ta cũng muốn hiểu vfprintf, chứ không chỉ viết bên dưới. Các chủ đề khác có chứa phần còn lại, mặc dù. –

Trả lời

7

Tôi nghĩ bạn đang nhìn vào lớp không đúng. Logic trong vfprintf chịu trách nhiệm định dạng các đối số của nó và viết chúng thông qua các hàm stdio cơ bản, thường là một bộ đệm trong đối tượng FILE đó là nhắm mục tiêu. Logic thực tế để đưa đầu ra này vào bộ mô tả tệp (hoặc trên các hệ thống giống như POSIX khác, trình bày tệp/thiết bị cơ bản) có thể là fwrite, fputc và/hoặc __ chức năng nội bộ được sửa đổi (có lẽ __overflow).

+2

Cảm ơn bạn - giữa câu trả lời này và http://stackoverflow.com/questions/2442966/c-c-function-definitions-without-assembly Tôi hiểu rõ hơn về những gì đang diễn ra. – sdasdadas