linux系统creat函数,Linux系统调用之creat函数

Linux中系统调用很多,但是再多也有几种不变的根本:创建,打开,写,读,关闭,删除,等最最基本的操作,就像人们所常说的,Linux上的一切我们都可以当做文件来处理,既然是文件,那么以上的几种操作就是必须的,还有一些高级的,我会陆续介绍。

想到这个函数,就想到了我们的open还不具备创建文件的能力之前,那时的creat是多么的辉煌,现在的open就像腾讯那样的霸道,什么都做,简直是百科全书。废话不多说了,介绍下creat()

位于#include

int creat(const char *pathname, mode_t mode);

成功返回为只写打开的文件描述符,若出错则返回-1.

注意:此函数等效于:

open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);

下面给个例子

很奇怪我没有包含 fcntl.h头文件,程序并没有报错,希望了解内情的同志留个言,让俺也长下见识。

#include

#include

#include

int main(void)

{

int fd = -1;

fd = creat("tmp.lock",00644);

if (0 > fd)

{

printf("errno:%s\n",strerror(errno));

}

else

{

close(fd);

}

printf("Execute ok: %d\n", fd); // 关闭之后再打印,fd的值竟然不变(测试才知道的)。

return 0;

}

写这个函数的目的为别的,就是想测测 creat创建的文件已经创建后,再次调用是否会出现 EEXIST错误,结果很失望,不会。

同一个程序执行数次,所得到的结果没有变化,fd=3。

不过学了样东西,慢慢来吧,啥都得从头开始,是不。

open就不行了。

需要fcntl.h------{小弟真的很困惑,难道标准库中包含了creat,为什么 open就需要引用这个头文件?}

#include

#include

#include

#include

int main(void)

{

int fd = -1;

fd = open("tmp.lock", O_WRONLY | O_CREAT | O_TRUNC, 00644);

printf("fd:%d\n",fd);

if(0 > fd)

{

printf("errno:%s\n",strerror(errno));

}

else

{

close(fd);

}

printf("Execute ok");

return 0;

}执行结果同上。

下面我就用了下 O_EXCL flag

#include

#include

#include

#include

int main(void)

{

int fd = -1;

fd = open("tmp.lock", O_WRONLY | O_CREAT | O_EXCL, 00644);

printf("fd:%d\n",fd);

if(0 > fd)

{

printf("errno:%s\n",strerror(errno));

}

else

{

close(fd);

}

printf("Execute ok");

return 0;

}

这次返回了EEXIST, fd = -1, 这下正合我意了。

关于open的一些列的flag,常用的也就那几个,列出来给大家个参考吧:

描述 (DESCRIPTION) open() 通常 用于 将 路径名 转换为 一个 文件描述符 (一个 非负的 小 整数, 在 read , write 等 I/O操作中 将会被使用). 当 open() 调用 成功, 它会 返回 一个 新的 文件描述符 (永远取 未用 描述符的 最小值). 这个调用 创建 一个 新的 打开文件, 即 分配 一个 新的 独一无二的 文件描述符, 不会与 运行中的 任何 其他程序 共享 (但 可以 通过 fork (2) 系统调用 实现 共享). 这个 新的 文件描述符 在其后 对 打开文件操作 的函数 中 使用.(参考fcntl(2)). 文件的 读写 指针 被 置于 文件头 参数 flags 是通过 O_RDONLY, O_WRONLY 或 O_RDWR (指明 文件 是以 只读 , 只写 或 读写 方式 打开的) 与 下面的 零个 或 多个 可选模式 按位 -or 操作 得到的: O_CREAT 若文件 不存在 将 创建 一个 新 文件. 新 文件 的 属主 (用户ID) 被 设置 为 此 程序 的 有效 用户 的 ID. 同样 文件 所属 分组 也 被 设置 为 此 程序 的 有效 分组 的 ID 或者 上层 目录 的 分组 ID (这 依赖 文件系统 类型 ,装载选项 和 上层目录 的 模式, 参考,在mount(8) 中 描述 的 ext2 文件系统 的 装载选项 bsdgroups 和 sysvgroups ) O_EXCL 通过 O_CREAT, 生成 文件 , 若 文件 已经 存在 , 则 open 出错 , 调用 失败 . 若是 存在 符号联接 , 将会 把 它的 联接指针 的 指向 文件 忽略. O_EXCL is broken on NFS file systems, programs which rely on it for performing locking tasks will contain a race condition. The solution for performing atomic file locking using a lockfile is to create a unique file on the same fs (e.g., incorporating hostname and pid), uselink(2) to make a link to the lockfile. If link() returns 0, the lock is successful. Otherwise, use stat(2) on the unique file to check if its link count has increased to 2, in which case the lock is also successful. O_NOCTTY 假如 pathname 引用 一个 终端设备 --- 参考 tty(4) --- 即使 进程 没有 控制终端 ,这个 终端 也 不会 变成 进程 的 控制 终端. O_TRUNC 假如 文件 已经 存在 , 且是 一个 普通 文件 ,打开 模式 又是 可写(即 文件 是 用 O_RDWR 或 O_WRONLY 模式 打开 的) , 就把 文件 的 长度 设置 为 零 , 丢弃 其中的 现有 内容.若 文件 是 一个 FIFO 或 终端设备 文件 , O_TRUNC 标志 被 忽略. 其他 O_TRUNC 的 作用 是 不 具体 指定 的 (在 许多 Linux 版本 中 , 通常 会 被 忽略 , 其他 的 一些 版本 将 返回 一个 错误) O_APPEND 文件 以 追加 模式 打开 . 在 写 以前 , 文件 读写 指针 被 置 在 文件 的 末尾 . as if with lseek. O_APPEND may lead to corrupted files on NFS file systems if more than one process appends data to a file at once. This is because NFS does not support appending to a file, so the client kernel has to simulate it, which can't be done without a race condition. O_NONBLOCK 或 O_NDELAY 打开(open) 文件 可以 以 非块(non-blocking) 模式 打开 . 此时 文件 并 没有 打开 , 也 不能 使用 返回 的文件描述符 进行 后续 操作 , 而是 使 调用 程序 等待 . 此 模式 是 为了 FIFO (命名管道) 的 处理 , 参考 fifo(4). 这种 模式 对 除了 FIFO 外 没有 任何 影响 . O_SYNC 打开 文件 实现 I/O 的 同步 . 任何 通过 文件描述符 对 文件 的 write 都会 使 调用 的 进程 中断 , 直到 数据 被 真正 写入 硬件 中 . 其他 , 参考 RESTRICTIONS. O_NOFOLLOW 假如 pathname 是 一个 符号 联接 , 则 打开 失败 . 这是 FreeBSD 的 扩充 , 从 2.1.126 版本 以来 被 引入 到 Linux 中来 . 从 glibc2.0.100 库 以来 , 头文件 中 包括 了 这个 参数 的 定义;    kernel 2.1.126 以前 将 忽略 它的 使用. O_DIRECTORY 假如 pathname 不是 目录 , 打开 就 失败 . 这个 参数 是 Linux 特有 的 , 在 kernel 2.1.126 中 加入 , 为了 避免 在 调用 FIFO 或 磁带设备 时 的 denial-of-service 问题 , 但是 不应该 在 执行 opendir 以外 使用. O_LARGEFILE 在 32位 系统 中 支持 大 文件系统 , 允许 打开 那些 用 31位 都 不能 表示 其 长度 的 大 文件 . 在 文件 打开 后 , 这些 可选 参数 可以 通过 fcntl 来 改变 . 在 新文件 被 创建 时 , 参数 mode 具体 指明 了 使用 权限 . 他 通常 也 会 被 umask修改 . 所以 一般 新建 文件 的 权限 为 (mode & ~umask). 注意 模式 只 被 应用 于 将来 对 这 新文件 的 使用 中; open 调用 创建 一个 新的 只读 文件 , 但 仍 将 返回 一个 可 读写 文件 描述符. 后面 是 一些 mode 的 具体 参数: S_IRWXU 00700 允许 文件 的 属主 读 , 写 和 执行 文件 S_IRUSR (S_IREAD) 00400 允许 文件 的 属主 读 文件 S_IWUSR (S_IWRITE) 00200 允许 文件 的 属主 写 文件 S_IXUSR (S_IEXEC) 00100 允许 文件 的 属主 执行 文件 S_IRWXG 00070 允许 文件 所在 的 分组 读 , 写 和 执行 文件 S_IRGRP 00040 允许 文件 所在 的 分组 读 文件 S_IWGRP 00020 允许 文件 所在 的 分组 写 文件 S_IXGRP 00010 允许 文件 所在 的 分组 执行 文件 S_IRWXO 00007 允许 其他 用户 读 , 写 和 执行 文件 S_IROTH 00004 允许 其他 用户 读 文件 S_IWOTH 00002 允许 其他 用户 写 文件 S_IXOTH 00001 允许 其他 用户 执行 文件 mode 只有 当 在 flags 中 使用 O_CREAT 时 才 有效 , 否则 被 忽略. creat 相当 于 open 的 参数 flags 等于 O_CREAT|O_WRONLY|O_TRUNC.   RETURN VALUE 返回值 open 和 creat 都 返回 一个 新的 文件描述符 (若是 有 错误 发生 返回 -1 ,并在errno 设置 错误 信息). 注意 open 可以 打开 设备 专用 文件 , 但是 creat 不能创建,需要用 mknod(2) 来代替. On NFS file systems with UID mapping enabled, open may return a file descriptor but e.g. read(2) requests are denied with EACCES. This is because the client performs open by checking the permissions, but UID mapping is performed by the server upon read and write requests. 若 文件 是 新 建立 的 , 他 的 atime(上次访问时间), ctime(创建时间), mtime(修改时间) 都 被 修改 为 当前 时间 , 上层 目录 的atime , ctime 也 被 同样 修改 . 其他的 , 假如 文件 是 由 O_TRUNC 参数 修改的 ,它的 ctime , mtime 域 也 被 设置 为 当前 时间. ERRORS 错误信息 EEXIST 参数 O_CREAT and O_EXCL 被使用,但是文件( pathname )已经存在. EISDIR 文件名 ( pathname ) 是 一个 目录 , 而 又 涉及 到 写 操作. EACCES  访问 请求 不 允许 (权限不够) , 在 文件名 ( pathname )中 有 一 目录 不允许 搜索 (没有 执行权限) , 或者 文件 还 不存在 且 对 上层目录 的 写 操作 又 不允许. ENAMETOOLONG 文件名 ( pathname ) 太 长 了 ENOENT 目录 ( pathname ) 不存在 或者 是 一个 悬空 的 符号 联接. ENOTDIR pathname 不是 一个 子目录 ENXIO 使用 O_NONBLOCK | O_WRONLY, 命名 的 文件 是 FIFO , 所读 文件 还 没有 打开 的 文件 , 或者 , 打开 一个 设备 专用 文件 而 相应 的 设备 不存在 ENODEV 文件 ( pathname ) 引用 了 一个 设备 专用 文件 , 而 相应 的 设备 又 不存在. (这是 linux kernel 的 一个bug - ENXIO 一定 会 被 返回 .) EROFS 文件 ( pathname ) 是 一个 只读 文件 , 又有 写 操作 被 请求. ETXTBSY 文件 ( pathname ) 是 一个 正在 被 执行 的 可 执行 文件 ,又有 写 操作 被 请求. EFAULT pathname 在一个你不能访问的地址空间. ELOOP 在 分解 pathname 时 , 遇到 太多 符号联接 或者 指明 O_NOFOLLOW 但是 pathname 是 一个 符号联接 ENOSPC pathname 将要被创建,但是设备又没有空间储存 pathname 文件了 ENOMEM 可 获得 的 核心内存(kernel memory) 不够 EMFILE 程序打开的文件数已经达到最大值了 ENFILE 系统打开的总文件数已经达到了极限

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防止在多模块Maven中找到“未找到插件”

在多模块Maven项目的子模块上定义Maven插件会给我们“找不到插件”错误。 尤其是如果我们有一个多模块项目&#xff0c;并且只想在一个特定模块中应用Maven插件&#xff0c;则此错误会经常发生。 假设我们有一个看起来像这样的多模块root pom。 <project xmlns"http:…

linux 4412跑程序,荣品4412的板子上跑纯linux

昨天开始突然想在4412上面跑人QT玩&#xff0c;首先得跑个纯linux昨天做好第一步&#xff0c;把根文件系统&#xff0c;用make_ext4fs 打包。make_ext4fs -l 34M -s system.img minifs/然后在uboot启动命令中把启动参数修改&#xff1a;setenv bootargs noinitrd root/dev/mmcb…

ASP.NET MVC 笔记

&#xff08;从今天开始&#xff0c;还是换回默认的代码高亮插件吧。。。话说此篇仅供个人遗忘后查阅&#xff0c;木有详尽解释。。。&#xff09; 1、Controller中的所有Action方法不限制返回值类型&#xff0c;返回值应该至少可以被ToString()&#xff0c;这样最终页面上呈现…

JPA 2.1:不同步的持久性上下文

JPA 2.1版带来了一种新的方式来处理持久性上下文与当前JTA事务以及资源管理器之间的同步。 术语资源管理器来自Java事务处理API &#xff0c;它表示操纵一个资源的组件&#xff08;例如&#xff0c;使用JDBC驱动程序操纵的具体数据库&#xff09;。 默认情况下&#xff0c;容器…

麒麟Linux启动目录,优麒麟目录结构介绍 系统入门必备

对于Linux爱好者来说&#xff0c;深入了解Linux文件目录结构的标准和每个目录的详细功能&#xff0c;对于我们用好Linux系统至关重要&#xff0c;下面就由小编给大家介绍下优麒麟系统的目录结构&#xff0c;PS: 同样适用于其他Linux发行版。查看系统的全部目录&#xff1a;* 在…

java课堂作业(一)

1、环境变量配置参见&#xff1a;http://www.cnblogs.com/dongwenbo/p/3282014.html window ---> preference ---> java ---> installed jres ---> add jres tomcat 配置&#xff1a;myeclipse ---> preferences ---> myeclipse enterprise workbench --->…

为什么我的JVM访问的内存少于通过-Xmx指定的内存?

“嘿&#xff0c;你能来看看奇怪的东西吗&#xff1f;” 这就是我开始研究一个支持案例的方式&#xff0c;该案例将我引向了这篇博客文章。 当前的特殊问题与不同的工具报告了有关可用内存的不同数字有关。 简而言之&#xff0c;一位工程师正在研究特定应用程序的过多内存使用…

linux怎么安装高德导航软件,高德地图车机版如何安装?高德地图车机版安装教程...

高德地图车机版是高德为汽车车载机提供的一个专用版本&#xff0c;对于车主们来说有时候用手机导航实在是非常不方便&#xff0c;不仅屏幕小而且还可能中途来个电话什么的。高德地图车机版可以帮你的车载机装上导航地图&#xff0c;就算你不想买导航设备也能让你的车子为你导航…

SharePoint 2010 技术参数(整理)

今天整理一些 SharePoint 2010 的技术参数&#xff0c;其内容都来自 SharePoint-Sandbox 网站。 有些参数值是硬性的&#xff0c;比如列表单条记录的尺寸&#xff1b;而有些是为了使用和性能考虑的推荐值。 技术参数值列表最大记录数500万条列表单条记录上限8KB&#xff08;不含…

Dropwizard,MongoDB和Gradle实验

介绍 我使用Dropwizard&#xff0c;MongoDB和Gradle创建了一个小项目。 它实际上是从一个实验性的Guava缓存开始的&#xff0c;作为将计数器发送到MongoDB&#xff08;或任何其他DB&#xff09;的缓冲区。 我也想尝试MondleDB插件的Gradle。 接下来&#xff0c;我想创建某种接口…

linux eclipse svn插件安装,Linux上Eclipse安装SVN插件和安装JavaHL

在Eclipse上安装svn插件有两种选择&#xff0c;一种是Subclipse&#xff0c;一种是Eclipse Subversion。前者是svn的官网eclipse插件&#xff0c;后者是eclipse的官方svn插件&#xff0c;具体有什么不同我也不算很清楚&#xff0c;想知道的请自行百度。网上建议用Subclipse&…

用apache的httpclient发请求和接受数据

此处发请求的是用httpclient4,请自己下载所需要的jar包。 发post请求&#xff0c;并得到数据。 String url "http://localhost:8080/lee";url url "/query/action/export.action";String exportFilePath "lee"".csv.";final HttpCl…

使用Flyway在Java EE中进行数据库迁移

任何Java EE应用程序的数据库模式都会随着业务逻辑一起发展。 这使得数据库迁移对于任何Java EE应用程序都非常重要。 您是否还在执行应用程序时手动执行它们&#xff1f; 它仍然是一个锁定步骤过程&#xff0c;还是作为两个单独的脚本运行–一个用于应用程序部署&#xff0c;…

suse linux安装rpm包,linux – 如何为Suse创建RPM

重建现有的src.rpm可能是最简单的.我肯定不会采用configure,make,make install的方式,因为(a)不能扩展,(b)不提供容易删除/升级包和(c)不是原子的.建立RPM并不是那么难.在他们销毁网站之前,Linux.com上曾经有一个非常好的初学者教程.你可以尝试这个one,但这是很多文字,不容易消…

在wp中,使用NavigationService.Navigate导航页面出现错误

我们在WP项目中采用页面导航时候&#xff0c;经常会使用以下代码 NavigationService.Navigate(new Uri("/Page1.xaml",UriKind.Relative));但是&#xff0c;有的时候会出现错误&#xff1a; "Error 1 An object reference is required for the non-static field…

linux iso合并,把RedHat Linux 5.0的CD ISO合并成DVD的脚本

最近找RedHat Linux5.0 x86_64的DVD ISO文件&#xff0c;结果一直找不到&#xff0c;却找到了6个cd的ISO&#xff0c;因为最后一个为源码盘&#xff0c;暂时不管&#xff0c;把其他5个CD合并成一个DVD。脚本如下&#xff1a;vim dvd.sh#!/bin/bash# by Chris Kloiber# A quick …

Guava的测试集合实现

我目前正在为LibFX添加一个新功能&#xff0c;为此我创建了一些类似于Java Collections Framework的自定义集合。 我一直在寻找可以针对它们进行测试的测试&#xff0c;并很高兴发现Google的Guava包含了我所需要的&#xff1a;一个庞大的测试套件&#xff0c;它针对JDK和Guava的…

SSDT – Error SQL70001 This statement is not recognized in this context-摘自网络

March 28, 2013 — arcanecode One of the most common errors I get asked about when using SQL Server Data Tools (SSDT) Database Projects is the error “This statement is not recognized in this context”. This is actually a pretty simple error to fix. Envisi…

linux wget 图片,15个Linux Wget下载实例终极指南

9、使用wget -i下载多个文件首先&#xff0c;保存一份下载链接文件cat>filelist.txt url1 url2 url3 url4接着使用这个文件和参数-i下载wget -i filelist.txt10、使用wget --mirror镜像网站下面的例子是下载整个网站到本地。wget --mirror -p --convert-links -P ./LOCAL UR…

带有JAX-RS和PrimeFaces的RESTful图表

通常&#xff0c;利用图表提供数据的可视表示很有用。 PrimeFaces提供制图解决方案&#xff0c;可轻松将数据的可视表示形式添加到Web和移动应用程序中。 如果将PrimeFaces图表组件与RESTful Web服务数据结合使用&#xff0c;我们可以创建自定义图表&#xff0c;以适合桌面和移…