2010-10-05 10 views
9

Đối với lớp hệ điều hành của tôi, tôi phải triển khai thực hiện các cuộc gọi hệ thống (không có printf)Làm thế nào tôi có thể làm cho hệ thống gọi write() in ra màn hình?

Đọc this reference Tôi thấy nó đang được sử dụng để in ra tệp. Tôi đoán tôi nên thao túng dòng chảy.

Trong ví dụ này xuất hiện: ofstream outfile ("new.txt",ofstream::binary);

Làm thế nào tôi có thể làm cho nó viết lên màn ảnh?

EDIT: Tôi nhận ra điều này viết() là một phần của thư viện iostream, điều này giống như cuộc gọi hệ thống int (int fd, char * buf, int size)?

+1

Và đừng quên rằng mèo Linux là GNU cat và thể thao 11 tùy chọn dòng lệnh không bị bỏ qua; -) .http: //linux.die.net/man/1/cat –

+0

Bạn ' đã gắn thẻ này là 'C' nhưng bạn đang nói về và đã liên kết với các lớp' C++ '. Đây có phải là C, hoặc C++? Re chỉnh sửa của bạn - Tôi sẽ không xem xét iostream được cho phép, cho "chỉ hệ thống cuộc gọi", chỉ có những thứ như 'man 2 write' –

Trả lời

7

Ghi vào bộ mô tả tệp cho đầu ra tiêu chuẩn hoặc lỗi chuẩn (1 và 2 tương ứng).

3
#include <unistd.h> 
/* ... */ 
const char msg[] = "Hello world"; 
write(STDOUT_FILENO, msg, sizeof(msg) - 1); 

tranh luận đầu tiên là mô tả tập tin cho STDOUT (thường 1), thứ hai là bộ đệm để viết từ, thứ ba là kích thước của văn bản trong bộ đệm (-1 là không in zero terminator).

19

Cuộc gọi hệ thống là dịch vụ do hạt nhân Linux cung cấp. Trong lập trình C, các hàm được định nghĩa trong libc cung cấp một trình bao bọc cho nhiều cuộc gọi hệ thống. Cuộc gọi hàm write() là một trong các cuộc gọi hệ thống này.

Đối số đầu tiên được chuyển đến write() là bộ mô tả tệp cần ghi. Các hằng số biểu tượng STDERR_FILENO, STDIN_FILENO, và STDOUT_FILENO đang lần lượt được xác định để , và trong unidtd.h. Bạn muốn viết thư cho STDOUT_FILENO hoặc STDERR_FILENO.

const char msg[] = "Hello World!"; 
write(STDOUT_FILENO, msg, sizeof(msg)-1);

Hoặc bạn có thể sử dụng syscall() chức năng để thực hiện một cuộc gọi hệ thống indirrect bằng cách xác định số lượng chức năng quy định tại syscall.h hoặc unistd.h. Sử dụng phương pháp này, bạn có thể đảm bảo rằng bạn chỉ sử dụng các cuộc gọi hệ thống. Bạn có thể tìm thấy The Linux System Call Quick Refernence (Liên kết PDF) hữu ích.

/* 4 is the system call number for write() */ 
const char msg[] = "Hello World!"; 
syscall(4, STDOUT_FILENO, msg, sizeof(msg)-1);
+0

Lạ, nhưng' syscall (4 ...) 'không hoạt động cho tôi, nhưng' syscall (1, 0, "12345 \ n", 6); 'đã hoạt động. – exebook

+0

@exebook 4 dành cho máy Mac, 1 dành cho Linux – Vad

+0

Liên kết tới tệp tham chiếu syscall PDF bị hỏng. Một thay thế không hoàn hảo có thể là: https://syscalls.kernelgrok.com/ –