Chinaunix首页 | 论坛 | 博客
  • 博客访问: 152686
  • 博文数量: 36
  • 博客积分: 802
  • 博客等级: 准尉
  • 技术积分: 717
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-02 22:47
文章分类
文章存档

2012年(36)

分类: LINUX

2012-08-15 07:46:18

为了锁住整个文件,通常是将l_start说明为0,l_whence说明为SEEK_SET,l_len说明为0.
F_SETLK:系统调用被用来设置或者释放锁,当l_type取F_RDLCK或者F_WRLCK时候,在由l_whence,l_start和l_len制定的区域上设置锁,当l_type取F_UNLCK的时候则释放锁,如果锁被其他进程占用,则返回-1并设置error.
F_SETLKW:与前者功能类似,不同的只是当希望设置的锁因为存在其他锁而被设置时候,回等待想冲突的锁释放
F_GETLK:此时第三个参数lock指向一个希望设置的锁的属性的结构,如果锁能被设置,改命令只是修改lock的l_type为F_UNLCK.(关于锁的具体参见前几天总结的各种锁的文章,再看一遍!运用一下)

单个进程在同一字节上只能设置一种锁,新的锁会取代旧的锁,锁的不兼容规则是针对多个进程之间。

(3)ioctl函数:用来控制设备,不能用本章其他函数进行的控制操作,都可以永ioctl来进行。
#include
int ioctl(int fd,int request,...);
ioctl用来控制特殊设备文件的属性,第一个参数fd必须是一个已经打开的文件描述副,第三个参数一般为char *argp,它随着第二个参数request的不同而不同,参数request决定了参数argp是向ioctl传递参数还是从ioctl获取数据。
//引用:
/ifconf通常是用来保存所有接口信息的
//if.h
struct ifconf
{
int ifc_len; /* size of buffer */
union
{
char *ifcu_buf; /* input from user->kernel*/
struct ifreq *ifcu_req; /* return from kernel->user*/
} ifc_ifcu;
};
#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
#define ifc_req ifc_ifcu.ifcu_req /* array of structures */
 
//ifreq用来保存某个接口的信息
//if.h
struct ifreq
{
char ifr_name[IFNAMSIZ];
union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
short ifru_flags;
int ifru_metric;
caddr_t ifru_data;
} ifr_ifru;
};
#define ifr_addr ifr_ifru.ifru_addr
#define ifr_dstaddr ifr_ifru.ifru_dstaddr
#define ifr_broadaddr ifr_ifru.ifru_broadaddr
 1. 先通过ioctl获得本地所有接口的信息,并保存在ifconf中
2. 再从ifconf中取出每一个ifreq中表示ip地址的信息
具体使用时我们可以认为ifconf就有两个成员:
ifc_len 和 ifc_buf
 
ifc_len:表示用来存放所有接口信息的缓冲区长度
ifc_buf:表示存放接口信息的缓冲区
所以我们需要在程序开始时对ifconf的ifc_len和ifc_buf进行初始化
接下来使用ioctl获取所有接口信息,完成后ifc_len内存放实际获得的借口信息总长度
并且信息被存放在ifc_buf中。


文件属性操作
1:操作
ls -l 显示文件属性(test1->./test表示该项的文件名是test1,它是一个指向目录./test的符号连接)
ls -lih 显示所有目录的节点,种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容。
第一项是节点
inode:
每个存储设备或存储设备的分区(存储设备是硬盘、软盘、U盘 ... ... )被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。而inode就是用来存储这些数据的信息.
2:获取文件属性

点击(此处)折叠或打开

  1. #include<sys/types.h>
  2. #include<sys/stat.h>
  3. #include<unistd.h>
  4. int stat(const char *file_name,struct stat *buf);
  5. int fstat(int filedes,struct stat *buf);
  6. int lstat(const char *file_name,struct stat *buf);
stat用于获取由参数file_name制定的文件名的状态信息,保存在参数struct stat *buf中
fstat与stat的不同是,它是由文件描述符制定文件的
lstat与stat的区别,对于符号链接文件,lstat返回的是符号连接文件本身的状态信息。stat返回的是符号连接指向的文件的状态信息。
(1)互为硬链接的文件
dandan@dandan-G31M-ES2C:~$ vim trynet.c
dandan@dandan-G31M-ES2C:~$ ls -li sun.txt
ls: 无法访问 sun.txt: 没有那个文件或目录
dandan@dandan-G31M-ES2C:~$ vim sun.txt
dandan@dandan-G31M-ES2C:~$ ls -li sun.txt
3151329 -rw-r--r-- 1 dandan dandan 16 2012-08-15 11:01 sun.txt
dandan@dandan-G31M-ES2C:~$ ln sun.txt sun002.txt
dandan@dandan-G31M-ES2C:~$ ls -li sun*
3151329 -rw-r--r-- 2 dandan dandan 16 2012-08-15 11:01 sun002.txt
3151329 -rw-r--r-- 2 dandan dandan 16 2012-08-15 11:01 sun.txt
它是通过ln创建的。(怎加了硬链接文件,-1变为-2)
互为硬链接关系的文件,他们好象是克隆体,他们的属性几乎是完全一样;,把其中一个删除另外一个仍然存在,要是修改了其中一个的性质,另外一个也会跟着修改。
只有文件才能创建硬链接,目录不行!
(2)软链接文件
dandan@dandan-G31M-ES2C:~$ vim linuxsir001.txt
dandan@dandan-G31M-ES2C:~$ ls -li linuxsir001.txt
3151327 -rw-r--r-- 1 dandan dandan 22 2012-08-15 11:07 linuxsir001.txt
dandan@dandan-G31M-ES2C:~$ ln -s linuxsir001.txt linuxsir002.txt
dandan@dandan-G31M-ES2C:~$ ls -li linuxsir001.txt linuxsir002.txt
3151327 -rw-r--r-- 1 dandan dandan 22 2012-08-15 11:07 linuxsir001.txt
3151330 lrwxrwxrwx 1 dandan dandan 15 2012-08-15 11:08 linuxsir002.txt -> linuxsir001.txt
它是通过ln -s创建的,他们很多属性几乎都不一样,把其中一个删除后,另外一个内容不能查看,而硬链接文件可以。
3:设置文件属性
有两种方法改变文件的属性(1)shell下运行chmod命令
                                          (2)chomn/fchown/lchown函数
#include
#include
int chown(const char *path,uid_t owner,gid_t group);
int fchown(int fd,uid_t owner,gid_t group);
chown会将参数path所指定的文件所有者id变更为参数owner代表的用户id,而将该文件所有这的组id改为参数group的id(如果owner和group制定为-1,那么文件用户id和组ID就不会被改变)
#include
#include
int truncate(const char *path,off_t length);
int ftruncate(int fd,off_t length);
truncate函数将path所指文件的大小改为length的大小。
#include
#include
int utime(const char *filename,struct utimbuf *buf);

#include
int utimes(char *filename,struct timeval *tvp);
struct utimbuf
{
time_t actime;
time_t modtime;
}
utime系统调用回把由第一个参数制定文件的存储时间修改为第二个参数buf的actime域。
#include
#include
mode_t umask(mode_t mask);
设置文件创建时候永的屏蔽字,并返回以前的值
在进程创建一个新闻间或者目录的时候,调用open函数创建一个新文件,存储权限是mode&~umask运算




阅读(1195) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~