Linux的I/0模型

1.针对每个进程,文件描述符都自成一套。也就是fd不能跨进程使用(有些socket现在可以支持传输fd,这种情况除外)。
2. stdin 0, stdout 1, stderr 2 shell 自动打开这三个fd,作为标准输入,标准输出,标准错误。注意,STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO是POSIX的标准名称(c语言),包含在 unistd.h 头文件中。stdin, stdout, stderr 是stdio流的名称(c++)。
利用stdio.h头文件中的freopen可以重新定义这些fd。所以可以利用这个函数来重定向标准输入输出和标准错误。
C99函数声明:
FILE freopen(const char restrict filename, const char * restrict mode, FILE * restrict stream)
返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。

将标准输入和标准输出都重定向到文件。
#include <stdio.h>
int main(void)
{
    int a, b;
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout); /*同上*/
    while (scanf("%d%d", &a, &b) != EOF)
        printf("%d\n",a+b);
    fclose(stdin);
    fclose(stdout);
    return 0;
将stdout重新定向到标准输出。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    FILE *stream;
    if ((stream = freopen("file.txt", "w", stdout)) == NULL)
        exit(-1);
    printf("this is stdout output\n");
    stream = freopen("/dev/tty","w",stdout);
    /*stdout是向程序的末尾的控制台重定向*/
    printf("And now back to the console once again\n");
    return 0;
}

3.各个系统或者语言定义的IO函数,要区分清楚,并理解它们之间的关系。
a. 系统调用有open(), close()等函数。系统调用是底层基础,c语言和c++定义的IO都是对系统调用的封装。
这些系统调用的头文件为 (sys/stat.h)(fcntl.h)
b. c语言的stdio.h定义了fopen(), fclose()等IO函数(以f开头,包括fscanf,fprintf()等), scanf和printf从标准输入读入,输出到标准输出。fscanf和fprintf对FILE进行操作,就是fopen返回的FILE指针。
stdin 标准输入,stdout标准输出,stderr, 标准错误。头文件为stdio.h
c. c++还定义了IOstream等流处理IO。它们都是对系统调用的包裹。istream(输入流), ostream(输出流),头文件为iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型。
cin 一个istream对象,从标准输入读取数据。cin >>a;
cout 一个ostream对象,向标准输出写入数据。 cout << b;
cerr,一个ostream对象,写入到标准错误。 cerr << “error”;
4.像open, close, read, write等属于通用IO,也就是不仅仅文件io,像设备驱动,socket等,都会实现,对于设备驱动,会有自己独有的接口,一般通过精准的ioctl来实现。对于文件io,则有fcntl来实现很多特有的接口。
open函数
int open(const char pathname, int flags, … /*mode_t mode/);
头文件:sys/stat.h fcntl.h
1.flag : O_RDONLY O_WRONLY O_RDWR O_CREATE, O_TRUNC……
2.mode : S_IRUSR, S_IWUSR, S_IRGRP, S_IWGRP, S_IROTH, S_IWOTH (只有0_CREATE标志时才需要此参数)
flag有些参数需要fcntl函数来设置和获取。

ssize_t read(int fd, void *buffer, size_t count); unistd.h
ssize_t write(int fd, void *buffer, size_t count); unistd.h
int close(int fd); unistd.h

off_t lseek(int fd, off_t ffset, int whence) unistd.h
whence : SEEK_SET, SEEK_CUR, SEEK_END
返回值为新的文件偏移量

ioctl
int ioctl(int fd, int request, …/argp/)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值