如何让系统调用write()打印到屏幕上?

时间:2010-10-05 17:39:59

标签: c linux system-calls

对于我的OS类,我应该只使用系统调用来实现Linux的cat(没有printf)

阅读this reference我发现它被用来打印到文件。我想我应该操纵游戏。

在示例中显示:ofstream outfile ("new.txt",ofstream::binary);

如何将其写入屏幕?

编辑:我意识到这个write()是iostream库的一部分,这与int write(int fd,char * buf,int size)系统调用相同吗?

5 个答案:

答案 0 :(得分:24)

系统调用是Linux内核提供的服务。在C编程中,函数在libc中定义,它为许多系统调用提供了包装器。函数调用write()是这些系统调用之一。

传递给write()的第一个参数是要写入的文件描述符。符号常量STDERR_FILENOSTDIN_FILENOSTDOUT_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