一、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 "),exit(-1);
- while(pdir=readdir(d))
- {
- printf("%s %d ",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 ",r);
- for(i=0;i<r;++i){
- printf("%s ",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 ",getpid());
- r=system("./test");
- //printf("%d ",r>>8); //跟下面一行等价
- printf("%d ",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