您的位置:首页 > 运维架构 > Linux

linux 高级编程

2014-02-03 01:44 393 查看

一、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 **)); //排序函数

//返回目录的个数

例子:

[cpp] view plaincopy





#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;

}

[cpp] view plaincopy





#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,原因就是上面一条

[cpp] view plaincopy





#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);

创建进程; 在父子进程之间建立一个管道

[cpp] view plaincopy





#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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: