系统IO总结

引文:系统IO看似比标准IO少很多,用起来可真不是看起来那么简单。

#include <sys/types.h>

#include <unistd.h>

#include <fcntl.h>
1.open a file and set flags for accessing.
int open(char *file,int flags);
flags:
    O_NONBLOCK:如果没有设置这个标志,那么打开的文件是阻塞型的,那么对这个文件的>访问是加锁的,对这个文件的重复访问(read(2),write(2))都是被阻塞的,试图重复访问
这个文件的进程处于忙等状态,而不是返回。直到前一个访问进程退出,其他进程才可能访
问这个文件。如果设置了这个标志,那么打开的文件为非阻塞型,如果其他进程试图在前一
个进程未退出时访问,则会返回错误EAGAIN,而不会忙等。
    O_CREAT:创建文件,创建时要指定用户、用户组、读写执行权限
    O_TRUNC:如果文件已经存在,打开并允许写时,文件大小变为0.
int close(int fd);
ssize_t read(int fd,void *buf,size_t count);
ssize_t write(int fd,void *buf,size_t count);
off_t lseek(int fd,off_t offset,int whence);


两个线程能否同时打开同一个文件?
答:文件的打开过程是阻塞的。比如打开一个slow device(例如fifo)时是阻塞等,如果被
信号打断,则会返回EINTR。

同一个文件描述符,如果有不同进程同时访问,结果如何?
答:如果文件打开时标志为O_NONBLOCK,只有一个进程可以访问,其他进程尝试打开时返回EAGAIN;如果未设置该标志,只有一个进程可以访问,其他进程尝试打开时忙等待。
思考:fopen是通过open实现的,那么它的标志位是什么?标准IO是阻塞型的,调用open()时
应该没有设置O_NONBLOCK标志位,个人猜测。

同一个文件能否在前一个进程未close的情况下,再次调用open重复打开?如果指定了不同>的flag,打开的文件的flag是什么状态?
答:可以。标志位变为最后一次修改的flag。
为了证明这个问题,为做了一个实验,并发现一些有趣的问题:


#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
void main()
{
    int fd1,fd2;
    int ret;
    fd1 = open("test",O_WRONLY);
    printf("fd1 = %d\n",fd1);
    ret = write(fd1,"well,i am here!\n",15);
    getchar();
    printf("ret = %d\n",ret);
    getchar();
    if(ret < 0)
        fprintf(stderr,"fd1 write err!\n");
    fd2 = open("test",O_RDONLY|O_NONBLOCK);
    getchar();
    printf("fd2 = %d\n",fd2);
    getchar();
    ret = write(fd2,"So,where are you!\n",100);
    getchar();
    if(ret < 0)
        fprintf(stderr,"fd2 write err!\n");
    getchar();
    while(1);
    close(fd1);
    close(fd2);
}

结果如下:

[root@ado 0906]# ./opentwice
fd1 = 3

ret = 30

fd2 = 4

fd2 write err!
第一个write可以写,第二个就不能写了,说明文件的权限发生了变化。

同时还发现:

 * 如果把第一个write的15改成更大的数字,查看文件会发现,除了"well,i am here"
 * 被写入外,"fd2 = %d""So,where are you!"也会写入一部分,具体写入多少,根据
 * 数字的大小而不同。
 * 原因是:这些字符串在内存中连续,执行write函数时会把这样大小内存区内容写入
 * 文件。程序中的所有字符串常量都被在内存的文字常量区保存,内存上是连续的,程序  * 执行前就在那里了。因此执行到
第一个write的时候,写入文件的就是这段内容的一部分 * 。这些内 * 容并非是程序中其他函数输入导致。
 *
 * 我加入了很多getchar(),而实验发现,第一次getcar之前文件中已经写入了所有内容。
 * 这一点证明多出来的内容并非是后面的程序所为,同时也证明了write是无缓冲的。
 *
 * 由此也可以看出,write函数是不会检测到'\0'或者'\n'而停止写入,而是根据第三个参 * 数决定写入的字符个数。













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值