IO函数
主要的IO函数有
read()/write()
recv()/send()
recvmsg()/sendmsg()
readv()/writev()
write()函数
#include <unistd.h>
ssize_t write (int __fd, const void *__buf, size_t __n);
将长度为__n的字节从__buf写入__fd指向的文件中。返回值如果与__n相同则表示成功,否则表示失败。
__fd是文件描述符。STDIN_FILENO(值为0)表示当前进程的标准输入;STDOUT_FILENO(值为1)表示当前进程的标准输出;STDERR_FILENO(值为2)表示标准错误输出。
read()函数
#include <unistd.h>
ssize_t read (int __fd, void *__buf, size_t __nbytes);
成功返回实际读到的字节数(小于等于__nbytes),0表示已读到文件尾无数据可读,出错返回-1。
#include <iostream>
#include<unistd.h>
#include <fcntl.h>
#include <stdlib.h>
using namespace std;
#ifndef FILE_TAG
#define FILE_TAG "/home/thinking/CPP/test.txt"
#endif
int main()
{
cout << "Hello World!" << endl;
int in_fd=open(FILE_TAG,O_RDONLY);
int tmp_read_num;
char buf[20];
while((tmp_read_num=read(in_fd,buf,sizeof(buf)))>0){
write(1,buf,tmp_read_num);
}
cout<<(close(in_fd)==0?"Close success":"Close failed")<<endl;
return 0;
}
recv()
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/socket.h>
ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);
此函数用于从套接字文件描述符中接收数据放到缓冲区中。成功返回实际读取数据的长度,失败返回-1
前三个参数很容易理解,最后一个参数__flags表示接收数据的方式,可选值如下(这些可选值可以组合使用):
MSG_DONTWAIT:将此次IO操作设置成非阻塞方式,立即读取当前套接字文件中的内容(即使没有任何内容)并立刻返回,不等待输入。
MSG_ERRQUEUE:从套接字错误队列中接收错误消息。
MSG_OOB:接收带外数据
MSG_PEEK:只读取,不清空数据。(默认情况下,数据从套接字文件里被读取之后将会被内核丢弃,不允许反复读取同一数据)
MSG_TRUNC:如果传入的缓冲区大小小于待读取的数据,系统将自动按找缓冲区大小截取数据并读出,其他数据则被丢弃(默认情况下,本次已读取的数据才会被内核丢弃,本次没读完的数据可以在下次再读取)。
MSG_WAITALL:阻塞操作,如果套接字文件中暂时没有足够的数据(即文件中的数据不足以充满缓冲区)则等待,直到数据填满缓冲区才读取并返回。
关于MSG_WAITALL,如果出现一下三种情况,即使缓冲区没读满也会返回:
1、捕获一个信号量
2、连接终止,此时函数将返回0
3、套接字上发生错误
这个函数错误码如下
send()
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/socket.h>
ssize_t send (int __fd, const void *__buf, size_t __n, int __flags);
此函数会将__buf中大小为__n的数据按照__flags指定的方式发送出去。其中__flags与recv()函数中的含义是一致的。send()之前套接字必须连接建立成功!
返回值是成功发送的数据长度。由于每次发送都有可能有部分数据没有成功地发送出去,所以可能需要根据返回值重发。
错误返回-1,错误码如下:
readv()和writev()
用于批量读/写(即对有多个缓冲区组成的缓冲区向量进行操作)
recvmsg()和sendmsg
这两个函数也可以完成批量读/写,sendmsg的操作方式由形参列表的第三个参数int __flags指定,recvmsg的操作方式形参列表的第二个参数msghdr* msg的成员变量msg_flags指定。
这两个函数与前面的函数不同的是,这两个函数可以选择对方的IP地址(即从指定的连接中读取数据)