Linux操作系统访问

                       Linux操作系统访问
一、POSIX和ANSI C标准
POSIX----Portable Operation System Interface for Unix
Ansi C----这一标准是 ANSI(美国国家标准局)于 1989 年制定的 C 语言标准。

1.1 POSIX
该标准最初由 IEEE 开发的标准族,部分已经被 ISO 接受为国际标准。该标准的具体内容 见 1.1.3。POSIX.1 和 POSIX.2 分别定义了 POSIX 兼容操作系统的 C 语言系统接口 以及 shell 和工具标准。这两个标准是通常提到的标准。POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX 是为了读音更 像 UNIX)。电气和电子工程师协会(Institute of Electrical and Electronics Engineers,IEEE) 最初开发 POSIX 标准,是为了提高 UNIX 环境下应用程序的可移植性。然而,POSIX 并不局限于 UNIX。 许多其它的操作系统,例如 DEC OpenVMS 和 Microsoft Windows NT,都支持 POSIX 标准,尤其是 IEEE Std. 1003.1-1990(1995 年修订)或 POSIX.1,POSIX.1 提供了源代码级别的 C 语言应用编程 接口(API)给操作系统的服务程序,例如读写文件。POSIX.1 已经被国际标准化组织(International Standards Organization,ISO)所接受,被命名为 ISO/IEC 9945-1:1990 标准。

1.2 ANSI C
这一标准是 ANSI(美国国家标准局)于 1989 年制定的 C 语言标准。 后来被 ISO(国际标准化组织)接受为标准,因此也称为 ISO C。
ANSI C 的目标是为各种操作系统上的 C 程序提供可移植性保证,而不仅仅限于 UNIX。 该标准不仅定义了 C 编程语言的语发和语义,而且还定义了一个标准库。这个库可以根据 头文件划分为 15 个部分,其中包括:
字符类型 (<ctype.h>)、
错误码 (<errno.h>)、
浮点常数 (<float.h>)、
数学常数 (<math.h>)、
标准定义 (<stddef.h>)、
标准 I/O (<stdio.h>)、—→ 如定义fopen,fwrite,fread,fseek等I/O函数。
工具函数 (<stdlib.h>)、
字符串操作 (<string.h>)、
时间和日期 (<time.h>)、
可变参数表 (<stdarg.h>)、
信号 (<signal.h>)、
非局部跳转 (<setjmp.h>)、
本地信息 (<local.h>)、
程序断言 (<assert.h>) 等等。




二、ANSI C与POSIX两套标准的区别
UNIX环 境下的C 对二进制流文件的读写有两套班子:
1)ANSI C标准: fopen,fread,fwrite,fseek,ftell,rewind,fputc,fputs,fgets,fget,fclose ;
2) POSIX标准:open, read, write,ioctl,getc,getchar,putc,putchar,close
这里简单的介绍一下他们的区别。
1. fopen 系列是标准的C库函数;open系列是 POSIX 定义的,是UNIX系统里的system call。也就是说,fopen系列更具有可移植性。
2. 使用fopen 系列函数时要定义一个指代文件的对象,被称为“文件句柄”(file handler),是一个结构体;而open系列使用的是一个被称为“文件描述符” (file descriptor)的int型整数。
3. fopen 系列是级别较高的I/O,读写时使用缓冲; 而open系列相对低层,更接近操作系统,读写时没有缓冲。由于能更多地与操作系 统打交道,open系列可以访问更改一些fopen系列无法访问的信息,如查看文件的读写权限。这些额外的功能通常因系统 而异。
4. 使用fopen系列函数需要"#include <sdtio.h>";
使用open系列函数需要"#include <fcntl.h>" ,链接时要之用libc(-lc)

ANSI C :缓冲文件系统
#include<stdio.h>
FILE * fopen(const char * path,const char * mode);
int fread(void *buffer,int size,int count,FILE *fp);
int fwrite(void *buffer,int size,int count,FILE *fp);
int fseek(FILE *stream, long offset, int fromwhere);
三、POSIX标准I/O操作----非缓冲文件系统
#include<stdlib.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>

(1)打开某(设备)文件的操作函数
  int open(const char *path,int oflag)
  函数功能:打开path所指的文件或(设备)文件,成功打开后返回文件描述符.
  参数1:文件路径或设备名.linux下的设备文件常存放在 /dev目录下.
  参数2:打开方式.
O_RDONLY 只读打开。
O_WRONLY 只写打开。
O_RDWR 读、写打开。
O_APPEND 每次写时都加到文件的尾端。
O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取许可权位。
O_EXCL 独占方式打开,如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。
O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。
O_NOCTTY 如果p a t h n a m e指的是终端设备,则不将此设备分配作为此进程的控制终端。
O_NONBLOCK 采用非阻塞文件IO方式,如果p a t h n a m e指的是一个F I F O、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
O_SYNC 使每次w r i t e都等到物理I / O操作完成。
O_DIRECT是direct   to   disk的,使用应用程序自己的buffer。
O_SYNC和O_DIRECT二者都是确保写盘。不同在于O_SYNC还要经过内核的buffer,而O_DIRECT是direct   to   disk的,使用应用程序自己的buffer。O_DIRECT用在Android JNI访问时会出错。
这是文件I/O的常用函数,open函数,open函数用来打开一个设备,他返回的是一个整型变量,如果这个值等于-1,说明打开文件出现错误,如果为大于0的值,那么这个值代表的就是文件描述符。一般的写法是
if((fd=open("/dev/ttys0",O_RDWR | O_NOCTTY | O_NDELAY)<0){
perror("open");
}
这个事常用的一种用法fd是设备描述符,linux在操作硬件设备时,屏蔽了硬件的基本细节,只把硬件当做文件来进行操作,而所有的操作都是以open函数来开始,它用来获取fd,然后后期的其他操作全部控制fd来完成对硬件设备的实际操作。你要打开的/dev/ttyS0,代表的是串口1,也就是常说的com1,后面跟的是一些控制字。int open(const char *pathname, int oflag, …/*, mode_t mode * / ) ;这个就是open函数的公式。控制字可以有多种,我现在给你列出来:

这些控制字都是通过“或”符号分开(|)
当调用系统调用open时,操作系统会将文件系统对应设备文件的inode中的file_operations安装进用户进程的task_struct中的file_struct.
(2)关闭某个(设备)文件
  int close(int fd)
  函数功能:关闭被打开的文件.
  参数:该参数是文件或(设备)文件.
  返回值:成功打开后返回0,失败返回-1.
  (3)读某个(设备)文件
  ssize_t read(int fd,void *buffer,size_t count)
  函数功能:从已打开的文件中读取数据
  参数1:(设备)文件或设备句柄,通常由open()函数返回.
  参数2:数据缓冲区.将读到的数据存放在该缓存内.
  参数3:要读取的字节数.
  返回值:成功读取返回读取的字节数,失败返回-1.
  (4)写某个(设备)文件
  ssize_t write(int fd,void *buffer,size_t count)
  函数功能:向已打开的(设备)文件中写入数据
  参数1:(设备)文件或设备句柄,通常由open()函数返回.
  参数2:数据缓冲区.将缓存内的数据写入某个(设备)文件中.
  返回值:成功写入后返回写入的字节数,失败返回-1.
  (5)设置I/O设备的属性
  #include <sys/ioctl.h>
  int ioctl(inf fd,unsigned long int cmd,...)
  函数功能:设置I/O设备的属性
  参数1:文件路径或设备名.linux下的设备文件常存放在/dev目录下.
  参数2:驱动程序控制命令
  返回值:成功返回0,失败返回错误码.
  Attention!!!
  以s3c2440的GPF设置为例:
  控制命令0                参数             意义
  GPIO_SET_PIN               n       设置第n个引脚输出高电平
  GPIO_SET_ALL_PIN           无       设置所有引脚输出高电平
  GPIO_CLR_PIN               n       设置第n个引脚输出低电平
  GPIO_CLR_ALL_PIN           无       设置所有引脚输出低电平
  GPIO_SET_PIN_OUT            n        设置第n个引脚为输出
  GPIO_SET_PIN_IN             n        设置第n个引脚为输入
  GPIO_SET_MULTI_PIN_OUT       n        将n中为1的位对应的引脚设置为输出
  GPIO_SET_MULTI_PIN_IN        n        将n中为1的位对应的引脚设置为输入
  如:ioctl(fd_gpf,GPIO_SET_MULTI_PIN_OUT,0xf0)
  将GPF的GPF4、GPF5、GPF6、GPF7为输出引脚.(f0-→11110000)



1.linux下的GPIO试验 http://linux.chinaitlab.com/c/830838.html
2.http://blog.csdn.net/skylj0209/article/details/3071507


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值