Chinaunix首页 | 论坛 | 博客
  • 博客访问: 621624
  • 博文数量: 329
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 693
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-05 23:37
个人简介

Do not panic!

文章存档

2021年(1)

2018年(3)

2017年(7)

2016年(98)

2015年(220)

我的朋友

分类: LINUX

2015-10-31 10:13:25

【access系统调用】 
  
功能描述: 
检查调用进程是否可以对指定的文件执行某种操作。 
  
用法: 
#include
#include

int access(const char *pathname, int mode);   
  
参数: 
pathname: 需要测试的文件路径名。   
mode: 需要测试的操作模式,可能值是一个或多个R_OK(可读?), W_OK(可写?), X_OK(可执行?) 或 F_OK(文件存在?)组合体。 
  
返回说明: 
成功执行时,返回0。失败返回-1,errno被设为以下的某个值 
EINVAL: 模式值无效   
EACCES: 文件或路径名中包含的目录不可访问 
ELOOP : 解释路径名过程中存在太多的符号连接 
ENAMETOOLONG:路径名太长 
ENOENT:  路径名中的目录不存在或是无效的符号连接 
ENOTDIR: 路径名中当作目录的组件并非目录 
EROFS: 文件系统只读 
EFAULT: 路径名指向可访问的空间外 
EIO:  输入输出错误 
ENOMEM: 不能获取足够的内核内存 
ETXTBSY:对程序写入出错 

例子: 
  
/* test.c */ /* test.c */ 
#include  
#include  
#include  
#include
  
int main(int argc, char *argv[]) 

    if (argc < 2) { 
        printf("Usage: ./test filename\n"); 
        exit(1); 
    } 
  
    if (access(argv[1], F_OK) == -1) { 
        puts("File not exists!"); 
        exit(2); 
    } 
  
    if (access(argv[1], R_OK) == -1)   
        puts("You can't read the file!"); 
    else 
        if (access(argv[1], R_OK | W_OK) != -1) 
            puts("You can read and write the file"); 
        else 
            puts("You can read the file"); 
  
       
    exit(0); 

#include  
#include  
#include  
#include
  
int main(int argc, char *argv[]) 

    if (argc < 2) { 
        printf("Usage: ./test filename\n"); 
        exit(1); 
    } 
  
    if (access(argv[1], F_OK) == -1) { 
        puts("File not exists!"); 
        exit(2); 
    } 
  
    if (access(argv[1], R_OK) == -1)   
        puts("You can't read the file!"); 
    else 
        if (access(argv[1], R_OK | W_OK) != -1) 
            puts("You can read and write the file"); 
        else 
            puts("You can read the file"); 
  
       
    exit(0); 
}




为了增强程序的可移植性,便有了size_t,它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t可能不一样。
在32位系统上 定义为 unsigned int
也就是说在32位系统上是32位无符号整形
在64位系统上 定义为 unsigned long
也就是说在64位系统上是64位无符号整形

size_t一般用来表示一种计数,比如有多少东西被拷贝等。例如:sizeof操作符的结果类型是size_t,
该类型保证能容纳实现所建立的最大对象的字节大小。
它的意义大致是“适于计量内存中可容纳的数据项目个数的无符号整数类型”。
所以,它在数组下标和内存管理函数之类的地方广泛使用。
而ssize_t:这个数据类型用来表示可以被执行读写操作的数据块的大小.它和size_t类似,但必需是signed.意即:它表示的是sign size_t类型的。


ssize_t是signed size_t,
size_t是标准C库中定义的,应为unsigned int。
socket_t:
数据类型"socklen_t"和int应该具有相同的长度.否则就会破坏 BSD套接字层的填充.POSIX开始的时候用的是size_t, Linus Torvalds(他希望有更多的人,但显然不是很多) 努力向他们解释使用size_t是完全错误的,因为在64位结构中 size_t和int的长度是不一样的,而这个参数(也就是accept函数 的第三参数)的长度必须和int一致,因为这是BSD套接字接口 标准.最终POSIX的那帮家伙找到了解决的办法,那就是创造了 一个新的类型"socklen_t".Linux Torvalds说这是由于他们 发现了自己的错误但又不好意思向大家伙儿承认,所以另外 创造了一个新的数据类型
阅读(372) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~