1、进程是处于活动状态的程序,某个用户通过操作系统运行程序所产生的进程代表着该用户的行为。如果用户不具备访问某个目录和文件的权限,那么该用户的进程也不能访问。
2、Linux系统中文件安全机制是通过给系统中的文件赋予两个属性来实现的,这两个属性分别是所有者属性和访问权限属性。Linux系统下的每一个文件必须严格地属于一个用户和一个组,针对不同的用户和组又具有不同的访问权限。
3、系统调用是Linux内核提供的功能十分强大的一系列的函数。这些函数是在内核中实现的,他们是应用程序和内核交互的接口,如图所示。
4、打开文件操作使用系统调用函数open(),该函数的作用是建立一个文件描述符,其他的函数可以通过文件描述符对指定文件进行读取与写入的操作。
新建目录操作可使用函数mkdir()实现
获得当前子目录的操作可使用函数getwd(),
重新指定调用进程的当前工作目录 chdir(const char* pathname)
删除目录操作可使用函数rmdir()完成,该函数的一般形式是:rmdir(路径),该函数必须是在该目录下没有子目录或文件的情况下才能运行。删除文件操作可使用函数unlink,该函数的一般形式是:unlink(路径);
获取文件状态和属性操作可使用fstat()、lstat()和stat()这三个函数来操作。获取的stat结构中有以下属性可以使用:
5、代码:
(1) FileHandler.c: file type and permission getter
/*
* FileOpenClose.c
*
* Created on: Jul 9, 2013
* Author: root
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
int f;
const char* f_path="test";
mode_t f_attrib;
f_attrib = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
struct stat *buf = malloc(sizeof(stat));
f= open(f_path, O_RDONLY);
if(f == -1){
f = open(f_path, O_RDWR | O_CREAT, f_attrib);
if(f != -1){
puts("create a new file successfully");
}else{
puts("unble to create a file, program exit");
return 1;
}
}else{
puts("open test file successfully");
}
close(f);
stat(f_path, buf);
//file mode: user permission
if(buf->st_mode & S_IRUSR){
puts("user have read permission!");
}
if(buf->st_mode & S_IWOTH){
puts("other users have write permission.!");
}else{
puts("other users don't have write permission.!");
}
//file mode: file type.
switch(buf->st_mode & S_IFMT){
case S_IFREG: puts("regular\n");break;
case S_IFDIR: puts("directory\n");break;
case S_IFCHR: puts("character special");break;
case S_IFBLK: puts("block special");break;
case S_IFSOCK:puts("socket");break;
default:puts("unknown mode");
}
return 0;
}
(2) DirectoryHandler.c: open a directory and read its sub files.
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char * argv[]){
char path[1000];
DIR * dp;
struct dirent * pdirent;
if(argc != 2){
printf("Usage ex3-9 <pathname>\n");
return 1;
}
if((dp=opendir(argv[1])) == NULL){
printf("OPen dir %s failed.\n", argv[1]);
return 2;
}
while((pdirent=readdir(dp)) != 0){
printf("%s\n", pdirent->d_name);
}
closedir(dp);
return 0;
}
(3) DirectoryHandler2.c: scan files in a directory
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
void scan_dir(char * pathname, int depth){
DIR * dp;
dp = opendir(pathname);
if(dp == NULL){
puts("directory open failed");
return;
}
chdir(pathname);
struct dirent * direntPointer;
//struct stat * pstat = malloc(sizeof(stat));
struct stat stat;
while((direntPointer = readdir(dp)) != NULL){
lstat(direntPointer->d_name, &stat);
if((strcmp(".", direntPointer->d_name) == 0) ||
(strcmp("..", direntPointer->d_name) == 0)){
continue;
}
if((strcmp("Debug", direntPointer->d_name) == 0)){
puts("debug*********");
}
if((stat.st_mode & S_IFMT) == S_IFDIR){
printf("%*s%s\n", depth, "", direntPointer->d_name);
scan_dir(direntPointer->d_name, depth+4);
}else{
printf("%*s%s\n", depth, "", direntPointer->d_name);
//puts(direntPointer->d_name);
}
}
chdir("..");
closedir(dp);
}
int main(){
puts("/home directory is \n");
scan_dir("/home", 0);
return 0;
}
(4) DirectoryHandler3.c: create directory and file, and delete file and directory. if the directory does'nt have any file, we can delete this directory.
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
mode_t mode;
mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP;
if(mkdir("testdir", mode) != -1){
puts("create testdir directory successfully.");
}
chdir("./testdir");
if(creat("testfile", mode) != -1){
puts("create testfile file successfully.");
}
if(unlink("testfile") != -1){
puts("delete testfile file successfully.");
}
chdir("..");
if(rmdir("testdir") != -1){
puts("delete testdir directory successfully.");
}
}