寒假学习 第13,14天 (linux 高级编程) 笔记 总结
一、IO与文件目录管理
1.pread与lseek+read的区别
pread读取后不会改变读写位置
2.mmap映射
/proc/${pid}/mem 无法映射,并且 mmap函数最后一个参数 文件中的映射开始位置 必须是pagesize的证书倍,否者出错
3.IO的实际用户(real user)与有效用户(effective user)
默认情况:有效用户与实际用户一致,但设置了设置位,就可能不一样了
实际用户:执行的用户
有效用户:权限用户
获取有效用户与实际用户
uid_t getuid(void); //实际用户
uid_t geteuid(void); //有效用户
4.目录相关的函数
int chdir(const char *path); //切换目录
int mkdir(const char *pathname, mode_t mode);//创建目录
int rmdir(const char *pathname); //删除目录
int unlink(const char *pathname); //删除文件
mode_t umask(mode_t mask); //设置文件权限屏蔽位
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf); //获取文件目录状态
5.目录的便利
DIR *opendir(const char *name); //打开文件目录,DIR为指向文件目录的指针
struct dirent *readdir(DIR *dirp); //读取文件目录
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; not supported
by all file system types */
char d_name[256]; /* filename */
};
int closedir(DIR *dirp); //关闭文件目录
void seekdir(DIR *dirp, long offset);
int dirfd(DIR *dirp);
int scandir(const char *dirp, // 目录名
struct dirent ***namelist, //返回目录列表
int (*filter)(const struct dirent *), // 回调函数,用来过滤目录, NULL 表示不过滤
int (*compar)(const struct dirent **, const struct dirent **)); //排序函数
//返回目录的个数
例子:
#include <dirent.h> #include <stdlib.h> #include <stdio.h> int main(int argc, const char *argv[]) { DIR *d; struct dirent *pdir; d = opendir("../day12"); if(d==NULL) printf("opendir error:%m\n"),exit(-1); while(pdir=readdir(d)) { printf("%s\t%d\n",pdir->d_name,pdir->d_type); } closedir(d); return 0; }
#include <stdio.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <dirent.h> int myfilter(const struct dirent*d) //筛选掉隐藏文件 { if(memcmp(d->d_name,".",1)==0){ return 0; }else{ return -1; } } int main(int argc, const char *argv[]) { struct dirent** d; int r; int i; r=scandir("/test",&d,myfilter,alphasort);//myfilter 自定义的筛选函数,alphasort系统提供的排序函数, printf("%d\n",r); for(i=0;i<r;++i){ printf("%s\n",d[i]->d_name); } return 0; }
二、进程
1.什么是进程
执行的程序:它能执行必定有代码->内存,文件等资源->CPU等
进程有很多数据维护:进程状态 / 进程的属性
所有的进程属性都采用结构体维护->实际上是树性数据结构
2.创建进程
1.代码?加载到内存?分配CPU时间片?
2.进程有关的创建函数
iint system(const char *command);
建立独立进程,拥有独立的代码空间,内存空间。等待新的进程执行完毕system才返回(阻塞)
返回值与进程的返回值有关,system的返回值中8-15位存放返回值。
任何线程的返回值都不要超过255,原因就是上面一条
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> int main(int argc, const char *argv[]) { int r; printf("%d\n",getpid()); r=system("./test"); //printf("%d\n",r>>8); //跟下面一行等价 printf("%d\n",WEXITSTATUS(r)); return 0; }
FILE *popen(const char *command, const char *type);
创建进程; 在父子进程之间建立一个管道
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> int main(int argc, const char *argv[]) { char buf[1024]; FILE *f=popen("ls -l","r"); int fd=fileno(f); int r; while((r=read(fd,buf,1024))>0) { buf[r]=0; printf("%s",buf); } close(fd); pclose(f); return 0; }
exec系列函数
fork