open:直接操作物理设备,比如磁盘、设备文件  一般设备/设备文件都通过open来操作 

fopen:则通过缓冲区来操作,读写都在缓冲区上 
popen:会调用fork()产生子进程,然后从子进程中调用/bin/sh   -c来执行参数command的指令 
依照popen参数中的type值建立管道连接到子进程的输入/输出设备中,通过返回的指针对子进程 
的输入、输出设备进行操作。

1.  fopen  

 打开普通文件

带缓冲区
缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数据。

函数原型:FILE * f open(const char * path,const char * mode);
所需库:< stdio.h>
返回值: 文件顺利打开后,指向该流的 文件指针就会被返回。如果 文件打开失败则返回NULL,并把 错误代码存在errno 中。
参数说明:
参数path 字符串包含欲打开的 文件路径及文件名,参数mode字符串则代表着流 形态。
mode有下列几种形态 字符串:
r 以 只读方式打开 文件,该文件必须存在。
r+ 以可读写方式打开 文件,该文件必须存在。
rb+ 读写打开一个 二进制文件,允许读写 数据。
rw+ 读写打开一个文本 文件,允许读和写。
w 打开只写 文件,若文件存在则文件长度清为0,即该文件内容会消失。若 文件不存在则建立该文件。
w+ 打开可读写 文件,若文件存在则文件长度清为零,即该文件内容会消失。若 文件不存在则建立该文件。
a 以附加的 方式打开只写 文件。若 文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的 文件。若 文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个 二进制文件;只允许写数据。
wb+ 读写打开或建立一个 二进制文件,允许读和写。
ab+ 读写打开一个 二进制文件,允许读或在文件末追加数据。
at+ 打开一个叫string的文件,a表示append,就是说写入处理的时候是接着原来文件已有内容写入,不是从头写入覆盖掉,t表示打开文件的类型是文本文件,+号表示对文件既可以读也可以写。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt,wt,其中t表示以 文本模式打开文件。由f open()所建立的新 文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask 值。
有些C 编译系统可能不完全提供所有这些功能,有的C 版本不用"r+","w+","a+",而用"rw","wr","ar"等,读者注意所用系统的规定。

2.  open    
打开设备文件
不带缓冲区
非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度 快

函数原型: int  open( const  char  *pathname,  int  flags);
                int  open( const  char  *pathname,  int  flags, mode_t mode);
所需库: #include <sys/types.h>    #include <sys/stat.h>    #include <fcntl.h>
返回值: 成功则返回文件描述符,否则返回 -1;
参数说明:

参数 pathname 指向欲打开的文件路径字符串. 下列是参数flags 所能使用的旗标:
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以可读写方式打开文件. 上述三种旗标是互斥的, 也就是不可同时使用, 但可与下列的旗标利用OR(|)运算符组合.
O_CREAT 若欲打开的文件不存在则自动建立该文件.
O_EXCL 如果O_CREAT 也被设置, 此指令会去检查文件是否存在. 文件若不存在则建立该文件, 否则将导致打开文件错误. 此外, 若O_CREAT 与O_EXCL 同时设置, 并且欲打开的文件为符号连接, 则会打开文件失败.
O_NOCTTY 如果欲打开的文件为终端机设备时, 则不会将该终端机当成进程控制终端机.
O_TRUNC 若文件存在并且以可写的方式打开时, 此旗标会令文件长度清为0, 而原来存于该文件的资料也会消失.
O_APPEND 当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面.
O_NONBLOCK 以不可阻断的方式打开文件, 也就是无论有无数据读取或等待, 都会立即返回进程之中.
O_NDELAY 同O_NONBLOCK.
O_SYNC 以同步的方式打开文件.
O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接, 则会令打开文件失败.
O_DIRECTORY 如果参数pathname 所指的文件并非为一目录, 则会令打开文件失败。注:此为Linux2. 2 以后特有的旗标, 以避免一些系统安全问题.

参数mode 则有下列数种组合, 只有在建立新文件时才会生效, 此外真正建文件时的权限会受到umask 值所影响, 因此该文件权限应该为 (mode-umaks).
S_IRWXU00700 权限, 代表该文件所有者具有可读、可写及可执行的权限.
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 权限, 代表其他用户具有可执行的权限.

返回值:若所有欲核查的权限都通过了检查则返回0 值, 表示成功, 只要有一个权限被禁止则返回-1.

错误代码:
EEXIST 参数pathname 所指的文件已存在, 却使用了O_CREAT 和O_EXCL 旗标.
EACCESS 参数pathname 所指的文件不符合所要求测试的权限.
EROFS 欲测试写入权限的文件存在于只读文件系统内.
EFAULT 参数pathname 指针超出可存取内存空间.
EINVAL 参数mode 不正确.
ENAMETOOLONG 参数 pathname 太长.
ENOTDIR 参数pathname 不是目录.
ENOMEM 核心内存不足.
ELOOP 参数pathname 有过多符号连接问题.
EIO I/O 存取错误.

附加说明:使用 access()作用户认证方面的判断要特别小心, 例如在access()后再作open()空文件可能会造成系统安全上的问题.

3.popen    
打开管道

函数原型: FILE  * popen (  const  char  * command ,  const  char  * type );
所需库:< stdio.h>
返回值: 如果调用 fork() 或 pipe() 失败,或者不能分配内存将返回NULL,否则返回标准 I/O 流。
参数说明: type  参数只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 "r" 则文件指针连接到 command 的标准输出;如果 type 是 "w" 则文件指针连接到 command 的标准输入。
command 参数是一个指向以 NULL 结束的 shell 命令字符串的 指针。这行命令将被传到 bin/sh 并使用-c 标志,shell 将执行这个命令。

fopen、open和popen区别相关推荐

  1. open,write,read与fopen,fwrite,fread的区别

    open:系统调用,返回的是文件描述符,即文件句柄,是文件在文件描述副表里的索引. fopen:C语言库函数,返回的是一个指向文件结构的指针.fopen是ANSI C标准中的C语言库函数,在不同的操作 ...

  2. fopen与open的区别

    一.fopen与open的区别 1.来源不同 open是unix系统调用函数(包括Linux),返回的是文件描述符,它是文件描述符表里的索引. fopen是ANSIC标准中的C语言库函数,在不同的系统 ...

  3. fopen 与 open 的区别

    1.来源不同 open 是 unix 系统调用函数(包括 Linux),返回的是文件描述符,它是文件描述符表里的索引. fopen 是 ANSIC 标准中的 C 语言库函数,在不同的系统中应该调不同的 ...

  4. linux中fopen和open的区别,Linux下open与fopen的区别

    int open(const char *path, int access,int mode) path 要打开的文件路径和名称 access 访问模式,宏定义和含义如下: O_RDONLY      ...

  5. fopen和open的区别

    文件操作一般分为两种:系统IO和标准IO 1.系统IO:系统调用接口,open(), read(), write(), close().是操作系统直接提供的编程接口(API). 2.标准IO:标准库的 ...

  6. fopen与open的区别(好文)

    参考文章:http://www.cnblogs.com/hnrainll/archive/2011/09/16/2178706.html http://www.cnblogs.com/joeblack ...

  7. python os.system 512_python os.system os.popen 区别

    最近有个需求就是页面上执行shell命令,第一想到的就是os.system, 复制代码代码如下: os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令执行结果 0或者 ...

  8. python os.system os.popen 区别

    python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后 者的返回值是脚本执行过程中的输出内容.实际使用时视需求情况而选择 ...

  9. c语言中freopen函数,fopen和freopen_C中freopen和fopen的区别(用法+详解+区别)

    最佳答案 fopen 是操作文件用的,比如创建读取等,它有两个参数,第一个是文件名,第二个是操作方式. 第一个参数很好理解,因为是用来操作文件的,自然得告诉它要操作的是什么文件. 第二个参数也不难理解 ...

最新文章

  1. HP-UX B.11.31从安装到VG配置
  2. 网络扫描工具Nmap常用命令
  3. OVS bridge和port(三十三)
  4. C语言树形打印二叉树
  5. mysql将大表定时转储_mysql数据库数据定时封装转储
  6. java方法示例注释 @_Java注释和真实世界的Spring示例
  7. wltc循环多少公里_原来所有车都烧机油!但是烧多少才算正常你知道吗?
  8. easyui combobox 左匹配模糊查询
  9. mysql解压版怎么添加服务_Windows系统下MySQL添加到系统服务方法(mysql解压版)
  10. 编程语言 - 大数据 - Hadoop
  11. [Unity3D]Unity3D圣骑士模仿游戏开发传仙灵达到当局岛
  12. 公安装备效能评估系统软件
  13. PreferenceActivity(首选项设置页)
  14. 网页木马是什么原理?
  15. python基础课件
  16. 什么是数据可视化技术
  17. 【降维打击】解决加密视频录屏问题
  18. 手工重建复合文档(.doc;xls,ppt)文件头,修复文件全过程
  19. 什么是火起来的“宅经济”,重庆阿尔克互联网技能帮扶学习,进入互联网
  20. CTF——MISC习题讲解(UTCTF2020系列)

热门文章

  1. matlab多缝衍射公式,多缝干涉仿真
  2. c++实现二叉排序树
  3. 奇偶位交换 牛客网 程序员面试金典 C++ Python
  4. 最接近的数 牛客网 程序员面试金典 C++ Python
  5. android 录入日期,Android 跟日期和时间有关的操作
  6. 【MySQL】with rollup的用法
  7. __main() 和 main()
  8. 表 1 化合物 1~95 的 TDP1 抑制活性(IC50、M 或 50M 时对 TDP1 的抑制率%)
  9. Firefox:曾经打破黑暗的产品
  10. UnityShader学习教程之<毛玻璃效果解析>