- 浏览: 1658343 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (405)
- C/C++ (16)
- Linux (60)
- Algorithm (41)
- ACM (8)
- Ruby (39)
- Ruby on Rails (6)
- FP (2)
- Java SE (39)
- Java EE (6)
- Spring (11)
- Hibernate (1)
- Struts (1)
- Ajax (5)
- php (2)
- Data/Web Mining (20)
- Search Engine (19)
- NLP (2)
- Machine Learning (23)
- R (0)
- Database (10)
- Data Structure (6)
- Design Pattern (16)
- Hadoop (2)
- Browser (0)
- Firefox plugin/XPCOM (8)
- Eclise development (5)
- Architecture (1)
- Server (1)
- Cache (6)
- Code Generation (3)
- Open Source Tool (5)
- Develope Tools (5)
- 读书笔记 (7)
- 备忘 (4)
- 情感 (4)
- Others (20)
- python (0)
最新评论
-
532870393:
请问下,这本书是基于Hadoop1还是Hadoop2?
Hadoop in Action简单笔记(一) -
dongbiying:
不懂呀。。
十大常用数据结构 -
bing_it:
...
使用Spring MVC HandlerExceptionResolver处理异常 -
一别梦心:
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法 -
dsjt:
楼主spring 什么版本,我的3.1 ,xml中配置 < ...
使用Spring MVC HandlerExceptionResolver处理异常
文件和目录管理:
1、获得文件metadata的Stat家族:
lstat和stat区别:
对于软链来说:
lstat返回软链本身的状态
stat返回软链所指文件的状态
struct stat:
例子:
2、文件权限:
设置文件权限的系统调用:
成功返回0,失败返回-1,并设置errno:
EACCESS:没有搜索path的权限
EBADF:fd不合法的文件描述符(仅fchmod)
EFAULT:path不合法的指针(仅chmod)
EIO:文件系统内部I/O错误
ELOOP:由于symbolic link导致解析path死循环
ENAMETOOLONG:path太长(仅chmod)
ENOENT:path不存在
ENOME:内存不足
ENOTDIR:不是一个目录(仅chmod)
EPERM:进程不是文件的owner或者缺少CAP_FOWNER能力。
EROFS:文件在只读文件系统中。
chomd:
3、文件的所有者:
stat结构中st_uid和st_gid提供了文件的所有者和group,一下系统调用可以改变所有者:
chown和lchown区别:chown会follow simbolic link,改变link的目标文件,lchmod改变符号链接本身。
成功过返回0,失败返回-1,并设置errno。
设置为root拥有者:
进程需要有CAP_CHOWN能力,也就是必须是root为所有。
4、文件系统Navigation:
1)改变当前的工作目录:
将当前的工作目录指定为path。
例子:
2)获得当前工作目录:
getcwd:
例子:
3)path conf:
5、创建目录:
成功返回0,失败返回-1,并设置好errno。没有可以递归删除与rm -r等价的系统调用。
如果目录非空,失败设置errno为ENOTEMPTY。
6、删除目录:
成功返回0,失败返回-1
7、文件夹访问:
1)opendir closedir, readdir
例子:显示pathname下的文件:
dirent结构:
POSIX仅需要d_name字段,其他的都是可选的或者是linux特有的。可移植性的程序应该只访问
d_name字段。
从Dir可以获得文件描述符:
这个是BSD的一个扩展,并不是POSIX标准。
2)访问文件的状态信息:
lstat、stat
8、硬链接和软链接:
硬链接:两个path指向同一个inode.
软链接:单独的一个文件,里面存储了链接文件的路径。
1)创建和删除一个硬链接:
为有path1指定的文件创建一个新的目录项。
2)创建和删除一个硬链接:
9、拷贝或者移动文件:
拷贝和移动文件时两个最基本的文件操作任务,可以使用shell命令cp和mv来完成。
1、拷贝文件:
Unix没有提供此操作的系统调用或者库来完成拷贝文件和目录,但可以使用cp命令来手工执行这个任务。
拷贝一个文件src到目标dst,要执行的操作步骤:
1、打开src
2、打开dst,创建如果不存在,清空如果存在。
3、将src读取到内存
4、将从src读取到的内容写入dst
5、继续指导所有内容从src写到dst
6、关闭dst
7、关闭src
如果拷贝一个目录,递归拷贝目录本身及其子目录通过mkdir及其采用上面步骤拷贝文件。
2、移动:
Unix提供了移动文件的系统调用。ANSI C使用这个调用来移动文件,POSIX标准将其用于文件和目录。
将路径名称从oldpath改成newpath,内容和inode没有变化。newpath需要在同一文件系统中。
成功返回0,失败返回-1,并设置errno。
10、创建临时文件:
1)ISO C标准定义了两个标准I/O函数来创建临时文件。
tmpnam每次产生一个不同的合法的路径名字。如果ptr是NULL,生成一个存储在静态区域的名字,
并返回指向它的指针,所以如果连续调用两次会覆盖前一次的tmpname。
如果指定了ptr,则它被假设指向一个数组,并且长度不小于L_tmpnam(<stdio.h>中定义)。
例子:
2)XSI扩展定义了两个另外的方法来操作临时文件:
tempnam和tmpnam一样,但是可以指定目录和前缀来生成临时文件名。
1、如果环境变量定义了TMPDIR,则使用它作为目录。
2、如果directory不为NULL,则使用它。
3、在<stdio.h>中的P_tmpdir作为目录。
4、本地的目录,通常/tmp被作为临时目录。
前缀prefix如果不为NULL,至少5个字节。
生成的名字是通过malloc动态申请的内存,所以要使用free释放。
mkstemp和tmpfile类似,只是返回了文件描述符,并且mkstemp生成的临时文件不会自动清除。
path的后六个字符要设置为XXXXXX,通过替换它来生成不同的名字。
参考:
1、《Linux system programming》
2、《Unix system programming》
3、《Advanced Programming in the Unix Environment》
1、获得文件metadata的Stat家族:
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int lstat(const char * restrict path, struct stat * restrict buf); int stat(const char *restrict path, struct stat * restrict buf); int fstat(int fd,struct stat *buf);
lstat和stat区别:
对于软链来说:
lstat返回软链本身的状态
stat返回软链所指文件的状态
struct stat:
struct stat{ dev_t st_dev; /*包含文件的设备号*/ ino_t st_ino; /*文件inode序列号 */ mode_t st_mode;/*文件的mode*/ nlink_t st_nlink; /*硬链接的数量*/ uid_t st_uid; /*文件的用户id*/ gid_t st_gid; /*文件的goup id*/ off_t st_size;/*文件大小*/ time_t st_atime;/*最后一次访问时间*/ time_t st_mtime;/*最后一次修改时间*/ time_t st_ctime;/*最后一次状态改变时间*/ }
例子:
#include <stdio.h> #include <time.h> #include <sys/stat.h> int isdirectory(char *path) { struct stat statbuf; if (stat(path, &statbuf) == -1) return 0; else return S_ISDIR(statbuf.st_mode); }
2、文件权限:
设置文件权限的系统调用:
#include <sys/types.h> #include <sys/stat.h> int chmod(const char *path, mode_t mode); int fchmod(int fd,mode_t mode);
成功返回0,失败返回-1,并设置errno:
EACCESS:没有搜索path的权限
EBADF:fd不合法的文件描述符(仅fchmod)
EFAULT:path不合法的指针(仅chmod)
EIO:文件系统内部I/O错误
ELOOP:由于symbolic link导致解析path死循环
ENAMETOOLONG:path太长(仅chmod)
ENOENT:path不存在
ENOME:内存不足
ENOTDIR:不是一个目录(仅chmod)
EPERM:进程不是文件的owner或者缺少CAP_FOWNER能力。
EROFS:文件在只读文件系统中。
chomd:
ret = chmod("./map.png",S_IRUSR | S_IWUSR); if(ret) perror("chmod");
int ret; ret = fchmod(fd, S_IRUSR | S_IWUSR); if(ret) perror("fchmod");
3、文件的所有者:
stat结构中st_uid和st_gid提供了文件的所有者和group,一下系统调用可以改变所有者:
#include <sys/types.h> #include <unistd.h> int chown(const char *path, uid_t owner, gid_t group); int lchown(const char *path, uid_t owner, gid_t group); int fchown(int fd, uid_t owner, gid_t group);
chown和lchown区别:chown会follow simbolic link,改变link的目标文件,lchmod改变符号链接本身。
成功过返回0,失败返回-1,并设置errno。
struct group *gr; int ret; gr = getgrnam("officers"); if(! gr){ perror("getgrnam"); return 1; } ret = chmod("manifest.txt",-1,gr->gr_gid); if(ret){ perror("chmod"); return 1; }
设置为root拥有者:
int make_root_owner(int fd){ int ret; ret = fchown(fd,0,0); if(ret) perror("fchown"); return ret; }
进程需要有CAP_CHOWN能力,也就是必须是root为所有。
4、文件系统Navigation:
1)改变当前的工作目录:
#include <unistd.h> int chdir(const char *path); int fchdir(int fd);
将当前的工作目录指定为path。
例子:
char *dir = "/tmp"; if(chdir(dir) == -1) perror("Failed to change current working directory to /tmp");
2)获得当前工作目录:
getcwd:
#include <unistd.h> char *getcwd(char *buf, size_t size);
例子:
#include <limits.h> #include <stdio.h> #include <unistd.h> #ifndef PATH_MAX #define PATH_MAX 255 #endif int main(void){ char mycwd[PATH_MAX]; if(getcwd(mycwd,PATH_MAX) == NULL){ perror("Failed to get current working directory"); return 1; } printf("Current working directory: %s\n",mycwd); return 0; }
3)path conf:
#include <unistd.h> long fpathconf(int fd, int name); long pathconf(const char *path,int name); sysconf(int name);
5、创建目录:
#include <sys/stat.h> #include <sys/types.h> int mkdir(const char *path, mode_t mode);
成功返回0,失败返回-1,并设置好errno。没有可以递归删除与rm -r等价的系统调用。
如果目录非空,失败设置errno为ENOTEMPTY。
int ret; ret = rmdir("/home/fuliang/test"); if(ret) perror("rmdir");
6、删除目录:
#include <unistd.h> int rmdir(const char *path);
成功返回0,失败返回-1
7、文件夹访问:
1)opendir closedir, readdir
#include <dirent.h> DIR *opendir(const char *dirname); struct dirent *readdir(DIR *dirp); int closedir(DIR *dirp); void rewinddir(DIR *dirp);
例子:显示pathname下的文件:
#include <dirent.h> #include <errno.h> #include <stdio.h> int main(int argc, char *argv[]){ struct dirent *direntp; DIR *dirp; if(argc != 2){ fprintf(stderr,"Usage %s directory_name\n", argv[0]); } if((dirp = opendir(argv[1])) == NULL){ perror("Failed to open directory"); return 1; } while((direntp = readdir(dirp)) != NULL) printf("%s\n", direntp->d_name); while((closedir(dirp) == -1) && (errno == EINTR)) ; return 0; }
dirent结构:
struct dirent{ ino_t d_ino; /* inode number */ off_t d_off; /* offset to the next dirent */ unsigned short d_reclen; /* length of this record */ unsigned char d_type; /* type of file */ char d_name[256]; /*filename*/ };
POSIX仅需要d_name字段,其他的都是可选的或者是linux特有的。可移植性的程序应该只访问
d_name字段。
从Dir可以获得文件描述符:
#define _BSD_SOURCE #include <sys/types.h> #include <dirent.h> int dirfd(DIR *dir);
这个是BSD的一个扩展,并不是POSIX标准。
2)访问文件的状态信息:
lstat、stat
8、硬链接和软链接:
硬链接:两个path指向同一个inode.
软链接:单独的一个文件,里面存储了链接文件的路径。
1)创建和删除一个硬链接:
#include <unistd.h> int link(const char *path1, const char *path2); int unlink(const char *path);
为有path1指定的文件创建一个新的目录项。
#include <stdio.h> #include <unistd.h> if (link("/dirA/name1","dirB/name2") == -1) perror("Failed to make a new link in /dirB");
2)创建和删除一个硬链接:
#include <unistd.h> int symlink(const char *path1, const char *path2);
9、拷贝或者移动文件:
拷贝和移动文件时两个最基本的文件操作任务,可以使用shell命令cp和mv来完成。
1、拷贝文件:
Unix没有提供此操作的系统调用或者库来完成拷贝文件和目录,但可以使用cp命令来手工执行这个任务。
拷贝一个文件src到目标dst,要执行的操作步骤:
1、打开src
2、打开dst,创建如果不存在,清空如果存在。
3、将src读取到内存
4、将从src读取到的内容写入dst
5、继续指导所有内容从src写到dst
6、关闭dst
7、关闭src
如果拷贝一个目录,递归拷贝目录本身及其子目录通过mkdir及其采用上面步骤拷贝文件。
2、移动:
Unix提供了移动文件的系统调用。ANSI C使用这个调用来移动文件,POSIX标准将其用于文件和目录。
#include <stdio.h> int rename(const char *oldpath, const char *newpath);
将路径名称从oldpath改成newpath,内容和inode没有变化。newpath需要在同一文件系统中。
成功返回0,失败返回-1,并设置errno。
10、创建临时文件:
1)ISO C标准定义了两个标准I/O函数来创建临时文件。
#include <stdio.h> char *tmpnam(char *ptr); /*返回执行路径的指针*/ FILE *tmpfile(void); /*返回文件指针,错误则为NULL*/
tmpnam每次产生一个不同的合法的路径名字。如果ptr是NULL,生成一个存储在静态区域的名字,
并返回指向它的指针,所以如果连续调用两次会覆盖前一次的tmpname。
如果指定了ptr,则它被假设指向一个数组,并且长度不小于L_tmpnam(<stdio.h>中定义)。
例子:
#include <stdio.h> int main(void){ char name[L_tmpnam],line[MAXLINE]; FILE *fp; printf("%s\n",tmpnam(NULL)); tmpname(name); printf("%s\n",name); if((fp = tmpfile()) == NULL){ perror("tmpfile"); return 1; } fputs("one line of output\n",fp); rewind(fp); if(fgets(line,sizeof(line),fp) == NULL){ perror("fgets"); return 1; } fputs(line,stdout); return 0; }
2)XSI扩展定义了两个另外的方法来操作临时文件:
#include <stdio.h> char *tempnam(const char *directory, const char *prefix); int mkstemp(char *template);
tempnam和tmpnam一样,但是可以指定目录和前缀来生成临时文件名。
1、如果环境变量定义了TMPDIR,则使用它作为目录。
2、如果directory不为NULL,则使用它。
3、在<stdio.h>中的P_tmpdir作为目录。
4、本地的目录,通常/tmp被作为临时目录。
前缀prefix如果不为NULL,至少5个字节。
生成的名字是通过malloc动态申请的内存,所以要使用free释放。
#include <stdio.h> int main(int argc, char *argv[]){ if(argc != 3){ pintf("usage: %s <directory> <prefix>",argv[0]); return 1; } printf("%s\n",tempnam(argv[1][0] != ' ' ? argv[1] : NULL, argv[2][0] != ' ' ? argv[2] : NULL)); return 0; }
mkstemp和tmpfile类似,只是返回了文件描述符,并且mkstemp生成的临时文件不会自动清除。
path的后六个字符要设置为XXXXXX,通过替换它来生成不同的名字。
参考:
1、《Linux system programming》
2、《Unix system programming》
3、《Advanced Programming in the Unix Environment》
发表评论
-
【zz】Vim的分屏
2012-04-26 11:13 1603分屏启动Vim 使用大写 ... -
bash的几种for循环
2012-04-26 11:13 18581、罗列式 for VARIABLE in 1 2 3 ... -
【zz】几个简单选项让你的Readline(Bash)更好用
2011-10-10 23:08 2429Reddit上的一位仁兄贴出了他的readline手册学习成果 ... -
pipe in -exec
2011-09-27 22:35 1433一个简单的例子: 将一堆的.txt文件,合并成一个文件,让每个 ... -
[zz]Unix调试的瑞士军刀:lsof
2011-08-31 10:33 1507原文见:http://heikezhi.com/2011/06 ... -
[zz]关于xargs,你可能不知道的
2011-08-29 23:05 2483如果你曾经花了许多时间在Unix命令行上,那么或许你已经见过x ... -
使用scala.sys.process包和系统交互
2011-07-19 00:00 6501在Java中我们可以使用Runtime.getRuntime( ... -
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法
2011-06-23 22:17 14482在笔记本安装Ubuntu11.04增强功能失败 引用 fuli ... -
awk getline
2011-06-02 23:58 5848awk getline开始一直用做按行读取文件。 getlin ... -
[zz]服务器性能评估
2011-04-29 14:17 4032工作这么久了,主 ... -
[zz]Top命令VIRT,RES,SHR,DATA的含义
2011-04-10 15:50 4133VIRT:virtual memory usage ... -
[zz]一些shell命令
2011-04-10 15:35 15191.显示消耗内存/CPU最多的10个进程 ps aux | ... -
Open VPN免密码配置
2011-03-03 22:55 3589公司VPN的帐号密码使用的是个超长的随机数,每次输入很麻烦,如 ... -
Linux下使用RTX腾讯通
2011-03-03 22:46 10795在公司为了使用RTX,专门安装了一个XP的虚拟机,但是这个也不 ... -
[zz]linux 常用命令总结:
2010-12-11 21:30 1700linux 常用命令总结: 一。 通用命令: 1. dat ... -
Ubuntu10.10解决Empathy无法链接MSN的问题
2010-10-21 16:36 37581.在Empathy中删除无法登录的MSN账户,并关闭Empa ... -
[zz]Vim的分屏功能
2010-10-21 13:09 1708分屏启动Vim 使用大写 ... -
Ubuntu10.10 64bit使用Eclipse插件subclipse问题
2010-10-20 20:32 1974升级到ubuntu10.10什么坑都碰到了,郁闷啊。发现sub ... -
scim输入法,Eclipse代码提示之后失去焦点的问题
2010-10-20 13:36 3095突然发现Eclipse,每次代码提示之后无法打字,感觉是文本域 ... -
Linux下使用谷歌输入法
2010-10-18 23:01 3149Linux的中文输入法一直太烂,scim终于出来对google ...
相关推荐
### Linux系统编程学习笔记 #### 一、IO **1.1 标准I/O (stdio)** - **fopen/fclose**: `fopen` 用于打开或创建一个文件,并返回一个指向该文件的 `FILE *` 类型的指针。`fclose` 用于关闭一个已经打开的文件。...
Linux系统编程笔记涉及到的内容广泛,涵盖了从基础的出错处理到进程管理,从内存管理到进程间通信,以及守护进程设计等多个层面的知识。下面详细说明各个部分的知识点: 1. 常见出错处理 - abort函数用于异常终止...
Linux系统编程是一门专注于Linux操作系统上应用程序和工具开发的学科。它包含了广泛的领域,如文件操作、进程管理、内存管理以及网络编程等。开发者在这一领域中,从基础的文件系统交互到复杂的网络通信和多线程编程...
【Linux 系统编程与内核驱动开发笔记】 在深入探讨Linux系统编程和内核驱动开发之前,我们首先要理解Linux操作系统的基本概念。Linux是一种自由、开放源码的类Unix操作系统,广泛应用于服务器、桌面环境以及各种...
1. **命令行基础**:了解如何在终端中启动和使用shell,学习基本的文件和目录操作,如`cd`(改变目录)、`ls`(列出目录内容)、`touch`(创建新文件)、`mv`(移动或重命名文件)和`rm`(删除文件)等。 2. **管道...
Linux操作系统是全球众多程序员...总之,Linux操作系统的学习笔记覆盖了从系统安装到文件管理,从用户权限到进程调度,从设备管理到网络控制等多个层面的知识点,是学习Linux操作系统和提升系统管理能力的重要资源。
根据提供的文件信息,我们可以推断出这是一份关于Linux编程学习笔记的PDF资料。下面将对这份资料可能涉及的关键知识点进行详细的阐述。 ### Linux编程基础知识 #### 1. Linux操作系统概述 - **定义与特点**:Linux...
总的来说,"Linux系统编程及网络编程笔记"会详细解析上述各个方面,包括理论知识、实际示例和最佳实践,旨在帮助学习者深入理解Linux环境下的系统编程和网络编程,为开发高效、安全的系统级应用程序和网络服务打下...
这个名为"Linux系统和网络编程学习文件"的压缩包很可能是为了帮助学习者掌握这些核心技能。以下是对其中涉及知识点的详细说明: 1. **Linux系统基础**: - **文件系统**:Linux使用的是类Unix的文件系统结构,了解...
这部分涵盖了Linux系统编程中常见的文件和I/O操作函数,这些函数对于管理和操作文件至关重要。 ##### 1. `open` - **定义**:`#include<unistd.h>` `int open(const char *pathname, int flags);` - **作用**:...
通过阅读《LinuxUNIX系统编程手册》(英文版),配合个人整理笔记和config.ini配置文件的辅助,读者将能够全面掌握Linux和UNIX环境下的系统编程技巧,从而能够编写高效、稳定的系统级应用程序。无论是对操作系统原理...
【Linux系统编程笔记1】 在Linux系统编程中,掌握命令行基础是至关重要的。`date`命令用于显示系统当前的时间,这在编写脚本或记录日志时非常有用。你可以通过`cat /etc/shells`来查看系统中可用的shell列表,而`...
本文档主要记录了 Linux 操作系统的学习笔记,涵盖了 Basic 的编程、VI 编辑器的使用、GCC 编译器的应用、GDB 调试工具的使用等方面的知识点。 一、编程基础 * 了解 C 语言的基本语法,例如变量声明、数据类型、...
这份“Linux学习笔记”旨在帮助初学者快速掌握Linux的基础知识和操作技能,从而轻松入门。 一、Linux简介 Linux并非单一的操作系统,而是基于Linux内核的一系列发行版的统称,如Ubuntu、CentOS、Fedora等。它倡导...
在LINUX与UNIX操作系统中,Shell编程是一种强大的工具,用于自动化日常任务、管理系统以及编写复杂的脚本。这份学习笔记将深入探讨Shell编程的基础,包括文件权限与安全,这是理解Linux和Unix系统管理的关键。 首先...
《马哥的Linux学习笔记》是一份针对初学者和进阶者精心编撰的Linux教程,旨在帮助读者全面掌握Linux操作系统的核心概念、命令行操作以及系统管理技能。这份笔记以清晰明了的语言和实例解析了Linux系统的各个方面,是...
Linux系统学习笔记和资料主要涵盖了Linux操作系统的基本概念、安装、常用命令、系统管理以及更深入的编程和服务器配置等内容。Linux是一种开源的操作系统,广泛应用于服务器、云计算、嵌入式设备等多个领域。以下是...
Linux学习基础笔记主要涵盖Linux操作系统的基本概念、安装与配置、常用命令、文件系统管理、用户权限与用户组、进程管理、网络配置以及shell脚本编程等多个方面。以下是对这些知识点的详细阐述: 1. **Linux操作...