linux下的stdin,stdout和stderr理解
在linux中经常会看到stdin,stdout和stderr,这3个可以称为终端(Terminal)的标准输入(standard input),标准输出( standard out)和标准错误输出(standard error)。
同时在Linux下查看/dev目录下的文件可以发现
➜ ~ ls -l /dev | grep std
lrwxrwxrwx 1 root root 15 Sep 23 00:29 stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Sep 23 00:29 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Sep 23 00:29 stdout -> /proc/self/fd/1
同时可以将字符给/etc/stdout输出字符
➜ ~ echo "hello stdout" >> /dev/stdout
hello stdout
➜ ~
标准输入(standard input)
在c语言中表现为调用scanf函数接受用户输入内容,即从终端设备输入内容。也可以用fscanf指明stdin接收内容。 标准输入的文件标识符为0。
#include<stdio.h>
#include<string.h>
int main()
{
char buf[1024];
//C语言下标准输入
scanf("%s",buf);
//UNIX下标准输入 stdin 0
fscanf(stdin,"%s",buf);
//read不建议使用 标准输入必须为0不能为stdin
read(0,buf,strlen(buf));
return 0;
}
标准输出(standard out)
在c语言中表现为调用printf函数将内容输出到终端上。使用fprintf也可以把内容输出到终端上。标准输出的文件标识符为1
#include<stdio.h>
#include<string.h>
int main()
{
char buf[1024];
//C语言下标准输入 输出
scanf("%s",buf);
printf("buf:%s\n",buf);
//UNIX下标准输入 stdin 0
fscanf(stdin,"%s",buf);
fprintf(stdout,"buf:%s\n",buf);
//read,write不建议使用
//标准输入必须为0不能为stdin 标准输出必须为1不能为stdout
read(0,buf,strlen(buf));
write(1,buf,strlen(buf));
return 0;
}
标准错误输出(standard error)
标准错误和标准输出一样都是输出到终端上, 标准错误输出的文件标识符为2。
#include<stdio.h>
#include<string.h>
int main()
{
char buf[1024]="error";
fprintf(stderr,"%s\n",buf);
write(2,buf,strlen(buf));
return 0;
}
fgets和fscanf的区别
fgets原型:
char *fgets(char *s, int size, FILE *stream);
示例:
#include<stdio.h>
int main()
{
char buf[128];
fgets(buf,sizeof(buf),stdin);
printf("%s",buf);
printf("end\n");
return 0;
}
➜ Desktop ./main
dasdsad sadas
dasdsad sadas
end
结论:fgets能够获取一行输入的内容,包括换行符\n
fscanf原型:
int fscanf(FILE *stream, const char *format, ...);
示例:
#include<stdio.h>
int main()
{
char buf[128];
fscanf(stdin,"%s",buf);
printf("%s",buf);
printf("end\n");
return 0;
}
➜ Desktop ./main
hello world
helloend
结论:fscanf只能获取一串字符串,遇到空格结束,不包括换行符