LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1024|回复: 4

关于open的问题

[复制链接]
发表于 2006-1-17 21:45:40 | 显示全部楼层 |阅读模式
按照apue上的一个例子,我输入:

  1. #include <fcntl.h>
  2. #include "apue.h"

  3. char buf1[] = "abcdefghij";
  4. char buf2[] = "ABCDEFGHIJ";

  5. int
  6. main()
  7. {
  8.   int fd;
  9.   
  10.   if((fd = open("file.hole", O_CREAT | O_WRONLY | O_TRUNC, FILE_MODE) < 0))
  11.      err_sys("create error");
  12.   
  13.   if(write(fd, buf1, 10) != 10)
  14.     err_sys("write buf1 error");
  15.   
  16.   if(lseek(fd, 16384, SEEK_SET) == -1)
  17.     err_sys("lseek error");
  18.   
  19.   if(write(fd, buf2, 10) != 10)
  20.     err_sys("write buf2 error");
  21.   
  22.   exit(0);
  23. }
复制代码

原来的代码是用create打开的,可是我的系统上好像没有create这个函数?于是我换成了open。可是虽然执行之后file.hole文件是创建了,但是事实上是往标准输出写的,而且提示lseek出错:

  1. ./a.out
  2. abcdefghijlseek error: Illegal seek
复制代码

我跟踪了一下,发现打开的那个fd事实上是0, 就是默认的标准输出吧?是不是shell自动为我打开了标准输出,可是这样的话,open的时候就不会再打开0了呀?还是其他什么原因呢?
 楼主| 发表于 2006-1-17 22:01:16 | 显示全部楼层
不好意思,原来是我笔误:
if((fd = open("file.hole", O_CREAT | O_WRONLY | O_TRUNC, FILE_MODE) < 0))
应该是
if((fd = open("file.hole", O_CREAT | O_WRONLY | O_TRUNC, FILE_MODE)) < 0)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-17 22:02:13 | 显示全部楼层
这下正确了,不好意思,斑竹请删贴。
回复 支持 反对

使用道具 举报

发表于 2006-1-18 00:22:33 | 显示全部楼层
谁都没有create
大家都有creat

Ken Thompson曾被问道如果他能重新设计UNIX他将做什么修改,他回答说:“我会在creat命令后加上个e。”

Ken Thompson was once asked what he would do differently if he were redesigning the UNIX system. His reply: "I'd spell creat with an e."

Ken Thompsonのスペルミス説, 当時のアセンブラの機能が乏しかったためラベル名が6文字に制限されていて_creatで6文字になり末尾にeが入れられなかった説などがある.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-18 12:09:29 | 显示全部楼层
:thank :!!
哦!原来如此!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表