open:
open可以打开或创建一个文件
#include<sys/types.h>
#Include<sys/stat.h>
#include<fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
返回值:返回新分配的文件的索引 出错返回-1并设置errno
pathname:可以是相对路径也可以是绝对路径
open:必选项 O_RDONLY 只读打开
O_WRONLY 只写打开
O__RDWR 可读可写
可选项 选多个或起来
O_CREAT 没的话创建 必须提供第三个参数mode
O_EXCL 同时指定O_CREAT 并且文件已经存在 则返回出错 也就是一定得打开的是创建的新文件
O_TRUNC 已存在 并且可写的情况下打开 将文件的长度截断为0
mode:八进制表示 0644 代表rw-(user) r–(group)r–(others)设置的权限会受umask的限制 可能有些权限会被mask遮挡
close:
#include<unistd.h>
int close(int fd);
read:
#include<unistd.h>
ssize_t read(int fd, void *buf, size_t count)
返回值:成功读取到的字符数 出错返回-1并设置errno,如果调read之前已经到达文件末尾,则返回0
从终端设备读,通常以行为单位,读到换行符就返回
write:
#include<unistd.h>
ssize_t wirte(int fd, const void *buf, size_t count)
返回值:成功读取到的字符数 出错返回-1并设置errno
阻塞与非阻塞:
阻塞:当进程调用一个阻塞的系统函数时,该进程被置于睡眠状态,这时内核调度其他进程运行,直到该进程等待的事件发生(比如网络上接收到数据包,或者调用sleep指定的睡眠时间到了)它才有可能继续运行。
与睡眠相对的是运行状态,在linux内核中,处于运行状态的进程分为两种情况:
正在被调度的执行:cpu处于该进程的上下文环境中,程序计数器保存着该进程的指令地址,正在执行该进程的指令,正在读写该进程的地址空间
就绪状态:该进程不需要等待什么事情发生,随时都可以执行,但cpu还在执行另一个进程,所以该进程在一个就绪队列中等待被内核调度 以下为实例
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
int main()
{
int fd=open("/dev/tty",O_RDONLY|O_NONBLOCK);
if(fd<0)
{
perror("open failure");
exit(1);
}
ssize_t n;
char buf[10];
while(1)
{
n=read(fd,buf,10);
if(~n)
{
printf("successfully read %ld bytes",n);
write(STDOUT_FILENO,buf,10);
break;
}
if(errno!=EAGAIN){
perror("fail");
exit(1);
}
write(STDOUT_FILENO,"try try?\n",9);
sleep(1);
}
close(fd);
return 0;
}
|