BLP-chap3-文件操作
时间:2009-05-15 来源:mercurial-hl
目录是文件,用来保存其他文件的节点号和名字
cd ~user:可以进入user的主目录
/dev/null:
写向该设备的输出被丢弃,读该设备会立刻返回一个文件结束符
创建空文件:
cp /dev/null empty_file
touch:
改变文件的修改时间,并不会把有内容的文件变成空文件
块设备是那些支持随即文件系统存取的设备,例如磁盘
库函数为了解决底层系统调用的低效率问题
open给出的模式值将与用户掩码(umask)的反值做AND操作。
strerror:(见apue p11)
#include <string.h>
char *strerror(int errnum);
strerror将errnum(通常是errno)映射为一个出错字符串,并返回此 字符串的指针。
XSI: X/Open System Interface,X/Open系统接口
创建临时文件的技巧:
先open创建一个文件,然后调用unlink。
如何在linux下使用c语言操作临时文件
unlink函数删除文件的目录入口,所以临时文件还可以通过文件描述符进 行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文 件被自动彻底地删除。
/proc文件系统:
linux提供一个特殊的文件系统procfs,通常表现为/proc.
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/version
cat /proc/net/sockstat
cat /proc/sys/fs/file-max
改变最多同时能打开的文件数:
echo 60000 > /proc/sys/fs/file-max
4 0 16828 16823 15 0 4660 1480 wait Ss pts/1 0:00 bash
[root@localhost chap3]# ls /proc/16828
attr coredump_filter environ limits maps mountstats root stat task
auxv cpuset exe limits mem oom_adj schedstat statm wchan
cmdline cwd fd loginuid mounts oom_score smaps status
[root@localhost chap3]# cat /proc/16828/cmdline
bash[root@localhost chap3]# od /proc/16828/cmdline
0000000 060542 064163 000000
0000005
[root@localhost chap3]# od -c /proc/16828/cmdline
0000000 b a s h \0
0000005
[root@localhost chap3]# ls /proc/16828/fd
0 1 2 255
目录扫描程序
运行:
cd ~user:可以进入user的主目录
/dev/null:
写向该设备的输出被丢弃,读该设备会立刻返回一个文件结束符
创建空文件:
cp /dev/null empty_file
touch:
改变文件的修改时间,并不会把有内容的文件变成空文件
块设备是那些支持随即文件系统存取的设备,例如磁盘
库函数为了解决底层系统调用的低效率问题
open给出的模式值将与用户掩码(umask)的反值做AND操作。
strerror:(见apue p11)
#include <string.h>
char *strerror(int errnum);
strerror将errnum(通常是errno)映射为一个出错字符串,并返回此 字符串的指针。
XSI: X/Open System Interface,X/Open系统接口
创建临时文件的技巧:
先open创建一个文件,然后调用unlink。
如何在linux下使用c语言操作临时文件
unlink函数删除文件的目录入口,所以临时文件还可以通过文件描述符进 行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文 件被自动彻底地删除。
/proc文件系统:
linux提供一个特殊的文件系统procfs,通常表现为/proc.
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/version
cat /proc/net/sockstat
cat /proc/sys/fs/file-max
改变最多同时能打开的文件数:
echo 60000 > /proc/sys/fs/file-max
4 0 16828 16823 15 0 4660 1480 wait Ss pts/1 0:00 bash
[root@localhost chap3]# ls /proc/16828
attr coredump_filter environ limits maps mountstats root stat task
auxv cpuset exe limits mem oom_adj schedstat statm wchan
cmdline cwd fd loginuid mounts oom_score smaps status
[root@localhost chap3]# cat /proc/16828/cmdline
bash[root@localhost chap3]# od /proc/16828/cmdline
0000000 060542 064163 000000
0000005
[root@localhost chap3]# od -c /proc/16828/cmdline
0000000 b a s h \0
0000005
[root@localhost chap3]# ls /proc/16828/fd
0 1 2 255
目录扫描程序
#include <unistd.h> #include <dirent.h> #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <string.h> /* 伪代码 * depthfirst(root) * { * for each node at or below root * visit node; * if node is a directory * depthfirst(node); * } */ void printdir(char *dir, int depth) { DIR *dp; /* 目录流 */ struct dirent *entry; /* dirent结构体 */ struct stat statbuf; /* 用于返回通过文件名查到的文件状态信息 */ /* 打开目录,并创建目录流 */ if ((dp = opendir(dir)) == NULL) { fprintf(stderr, "opendir %s error\n", dir); return; } chdir(dir); /* 循环读目录 */ while ((entry = readdir(dp)) != NULL) { lstat(entry->d_name, &statbuf); /* 获取文件状态信息 */ if (S_ISDIR(statbuf.st_mode))/* 如果是目录,则递归; 如果是文件,则打印名字*/ { if (strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0) continue; printf("%*s%s/\n", depth, " ", entry->d_name); /* 打印目录名 */ /* 递归 */ printdir(entry->d_name, depth+4); } else { printf("%*s%s\n", depth, " ", entry->d_name); /* 打印文件名 */ } } chdir(".."); closedir(dp); } int main(int argc, char *argv[]) { char *topdir = "."; if (argc >= 2) topdir = argv[1]; printf("directory scanf: %s\n", topdir); printdir(topdir, 0); exit(0); } |
运行:
[root@localhost chap3]# ./printdir /root/src/blp directory scanf: /root/src/blp chap11/ test_thread test_thread.c chap3/ copy_system.c destfile copy_system printdir.c srcfile printdir |
相关阅读 更多 +