If (isdir(dir->name)) continue;
If (dir->d_name[0] == '.') continue;
If (p==NULL) continue;
Strrchr :从最后开始找
Char *ptr = ".mp3". 文件个数
#include "count_line_file.h"
Gcc .c .c 同时编译
#ifndef
#else
#endif
Stat(name,&info);
If ((S_ISDIR)(info.st_mode))
Return 1;
Else
Return 0;
仅仅是一个名字
#ifndef
#define
#endif
最大名字
Stat((dir->d_name,&info);
If (max,info.st_size){
Max=
Strcpy(name,dir->d_name);
}
目录操作设置continue
Return;结束没有返回值的函数
没有加其它文件
Myls -l dir 现在当前目录 ls .. Cd .. ->ls
Chdir (argv[1]); cd dir cat a.c
Opendir("."); 切换
把名字连起来
Sprintf (name,"%s /%s",argv[1]),dir->d_name);
创建目录文件 : mkdir (目录名称,权限);
智能cp mycp 用递归
从mp3中提取专辑图片
Jpg 文件的协议头
知识:mp3文件格式,jpg文件格式
难点大小 不能用str 开头的函数
二进制文件有很多'\0'
Stat fstat lstat
文件名 文件描述符
Ln -s stat.c abcdef
Ls -l abcdef
创建快捷方式
Lstat 本身 stat stat.c 链接到
Chmod 修改文件权限 文件的复制(带权限)
在代码中添加 chmod(argv[2],info.argv1.st.mode) 最好在open后面加
Fchmod 文件描述符修改文件权限
面试题
已打开的文件描述符 ,如何获取文件名
Chown 改成 root uid 拥有者
Truncate 改变文件大小
Link 连接数
Symlink readlink 目录也是目录文件
/proc:不是保存在磁盘上是内核上的硬件 内核映像 内存映像
/bin /sbin /lib /root /proc (判断)进程号
每个数每个进程的pid
内核知道cpu
每个进程文件里有fd (子文件夹)
当前进程打开文件描述符
Ls -l
Getpid() /proc/pid/fd 都是一个link
后边的文件名
加sleep(100000) ps进程号
Open ps -aux | grep
Cd /proc/2885/进程号
3 link -> syslink readlink
属性是link lstat
用readlink
文件指向的文件描述符
Getcwd(); 绝对路径 唯一的
Pwd
Mkdir rmdir
获取文件描述符
带const 输入不带输出
Fd -> filename
Fd->FILE*
FILE * -> fd
FILE ->filename
第五章 文件操作 ANSI标准库提供的文件操作
找开文件 fopen
文件操作 读 写 ascii
字符 fgetc fputc ascii
行 fgets fputs ascii
块 fread fwrite ascii 二进制
关闭文件 fclose
缓冲
Exit() = 清缓冲 + _exit();
File 查看
Od -c 查看
Fp->FILE *
FILE -> fd
Fgets fputs 拷贝 '\0' 不好用
文本文件 open fopen
二进制文件:open fopen?不一定
Fopen(文件名,打开文式)
文件名,字符串,相对路径 绝对路径 "a.c"
打开方式 "r" "w" "r+" "w+" "a" "a+" 字符串
只读 只写 读写出错 读写0 只写
Strace ./a.out 追踪程序调用哪些系统
Fopen("a.c","rw"); O_RDONLY
Fopen("a.c","read+write"); r+
Fopen("a.c","roinu"); r
也是调用系统调用
Fopen("a.c","iiiiiiiiiiiiiii"); r
"r"
"w" 小心
"r+"
Objdump 反汇编 很有用
Fopen: 返回值 成功 FILE * 失败 NULL
地址 分配 在堆上 malloc
Fclose (); 关闭文件
参数; fopen 成功的返回值
1 free()
2 刷新缓冲区
Fputc -> 缓冲区 -> 文件名
如果不用fclose 不用exit
写 减小系统调用次数
直接用_exit()
Fgetc(); 从文件中获取一个字符 二进制文件a.out
参数1 fopen 的成功返回值
返回值 字符的ASCII 码 三个数就是一个整型
FILE *fp;
Fp = fopen("abc","r");
If (fp ==NULL)
Ch= fgetc(fp);
Read(fd,buf,1); 失败 EOF -1
Fputc(); 将字符写入到文件中
参数1 字符
参数2 fopen 成功之后返回值
重要fgets 从文件中获取字符串 buf 足够大
1 如果buf较大 fgets 会从文件中获取一行 mygetline
结果 文件 + \n + \0
参数 1 buf
参数 2 size
3 FILE *fopen 成功的返回值
fgets(buf,sizeof(buf),fp);
最多获取sizeof (buf)-1
返回值 成功返回参数1, 失败NULL
Memset (buf,'a',sizeof(buf))
最后有'\0'的
Fputs 将字符串输出到文件里
Fputs() 参数1:地址 (字符串起始地址)
参数2 fopen成功的返回值
提示:大一些
Fread() 参数1 地址
参数2 每次读几个
参数3 次数
参数4 fopen成功的返回值
结果:参数2*参数3 sizeof(buf)
返回值 成功 成功读取的次数 失败 0
Fread (buf,1,sizeof(buf),fp);
实际读到的字数 0 文件结尾
Fwrite()
1 地址
2 每一次写几个
3 次数
4 fopen成功的返回值
Fwrite(buf,1,字节数,fp);
Mydiff file1 file2
Mycat fgetc gets fread
Mycp fgetc fputc fgets fputs fread fwrite
Mydiff file1 file2
第三章
Open() read() write() lseek() close() dup dup2 fcntl ioctl
第四章
Stat() fstat() lstat() 获取 chmod修改
Chown() truncate() opendir() readdir() closedir() mkdir rmdir
Readdir syslink()
第五章
Fopen fclose fgetc fputc fgets fputs fread fwrite
第六章
Getpwuid getgrgid
第七章
进程环境 内存分步
设置环境变量 getenv setenv
PATH: 进程表 信号
Main.c 并发
结束进程 return exit 刷新 _exit 不刷新
内存分步 可用 用了多少
第八章
创建进程
Fork vfork 区别
Vfork + exec 执行新
共用同一数据区,快,东西小
Fork 相对独立,创建子进程
父进程与子进程区别
继承:数据段,文本段 a, for 已经打开的文件描述符
Fork()
返回值 在父进程中返回子进程pid
在子进程中返回0
Pid = fork(); 一式两份
创建n个进程
A.out a.out a.out a.out
B.A.out
C.A.out
D.A.out
E.A.out
F.A.out
G.A.out
每个进程做不同的东西
谁先结束 父子进程
父进程先结束 子进程?守护 init
子进程先结束
Wati() 1 清理僵尸
2 协调进程
执行现有的功能 exec
Ececl ("/bin/ls","ls","-l",NULL);
Execl()
Execv();
Execlp();
Execvp();
Execle();
Execve()
Char *cmd_argv[]={"ls","-l",NULL};
Execv("/bin/ls",cmd_argv);
Execlp("ls","ls","-l",NULL);
Char *cmd_argv[]={"ls","-l",NULL};
Execvp(cmd_argv[0],cmd_argv); shell