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

C 如何使系统调用write()打印到屏幕上?,c,linux,system-calls,C,Linux,System Calls,对于我的OS类,我应该只使用系统调用(无printf)实现Linux的cat 阅读时,我发现它被用来打印文件。我想我应该控制这股气流 在该示例中出现:ofstream outfile(“new.txt”,ofstream::binary) 如何使其写入屏幕 编辑:我意识到这个write()是iostream库的一部分,这与int-write(int-fd,char*buf,int-size)系统调用相同吗?否,std::ostream::write与write系统调用不同。它确实(几乎可以肯定)

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

阅读时,我发现它被用来打印文件。我想我应该控制这股气流

在该示例中出现:
ofstream outfile(“new.txt”,ofstream::binary)

如何使其写入屏幕


编辑:我意识到这个write()是iostream库的一部分,这与int-write(int-fd,char*buf,int-size)系统调用相同吗?否,
std::ostream::write
write
系统调用不同。它确实(几乎可以肯定)使用了
write
系统调用,至少在像Linux这样有这种功能的系统上是这样的,而且它通常会做类似的事情,但它仍然是一个独立的东西

然而,Linux将为您的进程预先打开标准输入、标准输出和标准错误流。要写入屏幕,通常使用
write
(即系统调用)写入流号
1
或流号
2
(分别为标准输出和标准错误)

如果您需要写入屏幕,即使它们被重新定向,您通常会打开一个流到
/dev/tty
,然后(再次)使用
写入

#包括
#包括
#包括
#包括
int main(){
char msg[]=“你好\n”;
int fd=打开(“/dev/tty”,仅限O_wr);
写入(fd、msg、sizeof(msg));
返回0;
}
#包括
/* ... */
const char msg[]=“你好,世界”;
写入(STDOUT_文件号,msg,sizeof(msg)-1);

第一个参数是STDOUT的文件描述符(通常是
1
),第二个参数是要从中写入的缓冲区,第三个参数是缓冲区中文本的大小(
-1
是不打印零终止符)。

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

传递给的第一个参数是要写入的文件描述符。符号常数
STDERR\u FILENO
STDIN\u FILENO
STDOUT\u FILENO
在中分别定义为201。您想写入标准输出文件号标准输出文件号

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

您也可以使用该函数通过指定在syscall.hunistd.h中定义的函数号来执行一个不正确的系统调用。使用此方法,可以保证只使用系统调用。您可能会发现(PDF链接)很有帮助

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

你的参考资料不正确。它是C++的一部分,与你的任务无关。正确的参考是

#定义_GNU_源代码/*参见功能测试宏(7)*/
#包括//用于打开、关闭、读取、写入、fsync
#包含//用于系统调用id\uuunr\uxxx
//方法1:API
写入(1,“通过API写入”\n)\
strlen(“通过API写入”);
fsync(1);
//方法2:通过系统调用id
const char msg[]=“你好,世界!通过系统调用\n”;
系统调用(\uuuunr\uwrite,STDOUT\ufileno,msg,sizeof(msg)-1);
系统调用(uu NR_fsync,STDOUT_FILENO);//fsync(STDOUT_FILENO);

并且不要忘记Linux cat是GNU cat,sports 11非忽略命令行选项;-)。您已将其标记为
C
,但您正在谈论并链接到
C++
类。这是C还是C++?你的编辑-我不会考虑允许IoSt流,只给出“系统调用”,只有“代码> man 2编写<代码>代码奇怪,但是<代码> SysCurle(4…)<代码>对我来说不起作用,但是<代码> SysCurrar(1, 0,“12345 \n”,6);代码>成功。@exebook 4用于Mac,1用于LinuxLink至系统调用参考PDF。不完美的替代品可能是:
/* 4 is the system call number for write() */
const char msg[] = "Hello World!";
syscall(4, STDOUT_FILENO, msg, sizeof(msg)-1);
#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);