linux下的stdin,stdout和stderr理解

在这里插入图片描述

来源:微信公众号「编程学习基地」

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只能获取一串字符串,遇到空格结束,不包括换行符

猜你喜欢

转载自blog.csdn.net/qq_44519484/article/details/108755695