对于我的OS类,我应该只使用系统调用来实现Linux的cat(没有printf)
阅读this reference我发现它被用来打印到文件。我想我应该操纵游戏。
在示例中显示:ofstream outfile ("new.txt",ofstream::binary);
如何将其写入屏幕?
编辑:我意识到这个write()是iostream库的一部分,这与int write(int fd,char * buf,int size)系统调用相同吗?
答案 0 :(得分:24)
系统调用是Linux内核提供的服务。在C编程中,函数在libc中定义,它为许多系统调用提供了包装器。函数调用write()
是这些系统调用之一。
传递给write()
的第一个参数是要写入的文件描述符。符号常量STDERR_FILENO
,STDIN_FILENO
和STDOUT_FILENO
分别定义为 2 , 0 和 1 强>在unidtd.h。您想写入 STDOUT_FILENO 或 STDERR_FILENO 。
const char msg[] = "Hello World!";
write(STDOUT_FILENO, msg, sizeof(msg)-1);
您也可以使用syscall()
函数通过指定 syscall.h 或 unistd.h 中定义的函数编号来执行直接的系统调用。使用此方法,您可以保证只使用系统调用。您可能会发现The Linux System Call Quick Refernence(PDF链接)有帮助。
/* 4 is the system call number for write() */
const char msg[] = "Hello World!";
syscall(4, STDOUT_FILENO, msg, sizeof(msg)-1);
答案 1 :(得分:8)
写入标准输出或标准错误(分别为1和2)的文件描述符。
答案 2 :(得分:3)
#include <unistd.h>
/* ... */
const char msg[] = "Hello world";
write( STDOUT_FILENO, msg, sizeof( msg ) - 1 );
第一个参数是STDOUT
的文件描述符(通常是1
),第二个是要写入的缓冲区,第三个是缓冲区中文本的大小(-1
是不打印零终结符。)
答案 3 :(得分:2)
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <unistd.h> // For open, close, read, write, fsync
#include <sys/syscall.h> //For SYSCALL id __NR_xxx
//Method 1 : API
write(1,"Writing via API\n",\
strlen("Writing via API\n") );
fsync(1);
//Method 2 : Via syscall id
const char msg[] = "Hello World! via Syscall\n";
syscall(__NR_write, STDOUT_FILENO, msg, sizeof(msg)-1);
syscall(__NR_fsync, STDOUT_FILENO ); // fsync(STDOUT_FILENO);
答案 4 :(得分:-2)
您的参考不正确。它是C ++的一部分,与你的任务无关。正确的参考是http://www.opengroup.org/onlinepubs/9699919799/functions/write.html