实验 6-1 1.针对符号连接文件和硬连接文件。测试以下函数,分析其执行过程并给出结论。 link() unlink() symlink() readlink() stat() lstat(

来源:互联网 发布:淘宝附近的人取消了吗 编辑:程序博客网 时间:2024/05/21 16:13
实验 6-1   1.针对符号连接文件和硬连接文件。测试以下函数,分析其执行过程并给出结论。 link()  unlink() symlink() readlink() stat() lstat()  link() unlike() 测试:#include<stdio.h>#include<unistd.h>#include<stdlib.h>int main(int argc,char *argv[]){unlink("hard_test");printf("befor create hard link\n");system("ls -l hard_test");if((link(argv[1],"hard_test"))==-1){perror("link");exit(EXIT_FAILURE);}printf("after create hard link for argv[1]\n");system("ls -l hard_test");if((unlink(argv[1]))==-1){perror("unlink");exit(EXIT_FAILURE);}printf("after runlink the hard link\n");system("ls -l hard_test");}分析:首先确保没有hard_test这个文件,要查看创建前文件是否存在,再用link()函数创建硬连接,查看创建结果,文件属性硬连接数是2,用unlink()函数删除源文件,这时文件属性硬连接数是1。symlink() readlink()函数测试:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#define BUFSIZE 128int main(int argc,char *argv[]){char buf[BUFSIZE];memset(buf,'\0',BUFSIZE);//unlink("sym_link_test");if((symlink(argv[1],"sym_link_test"))==-1){perror("symlink");exit(EXIT_FAILURE);}if((readlink("sym_link_test",buf,BUFSIZE))==-1){perror("readlink");exit(EXIT_FAILURE);}printf("sym_link_test is the symbol link of %s\n",argv[1]);system("ls -l  sym_link_test");}分析:首先确保sym_link_test文件不存在,再用symlink()函数创建符号连接文件,再用readlink()函数将指定符号连接文件的源文件路径读入buf中,列出基本信息。stat()函数测试:#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#define N_BITS 3int main(int argc,char *argv[]){unsigned int i,mask=0700;struct stat buff;static char *perm[]={"---","--x","-w-","-wx","r--","r-x","rw-","rwx"};if(argc>1){if((stat(argv[1],&buff)!=-1)){printf("permissions for %s\t",argv[1]);for(i=3;i;--i){printf("%3s",perm[(buff.st_mode&mask)>>(i-1)*N_BITS]);mask>>=N_BITS;}putchar('\n');}else{perror(argv[1]);exit(1);}}else{fprintf(stderr,"Usage:%s file_name\n",argv[0]);}return 0;}分析:用state()函数读取文件的属性,并输出文件的读写权限。lstat()函数测试:#include <sys/types.h>#include <sys/stat.h>#include <stdlib.h>#include <stdio.h>int main(int argc, char *argv[]){int i;struct stat buf;char *ptr;for (i = 1; i < argc; i++) {printf("%s: ", argv[i]);if (lstat(argv[i], &buf) < 0) {perror("lstat");continue;}if(S_ISREG(buf.st_mode))ptr = "regular file";else if (S_ISDIR(buf.st_mode))ptr = "directory file";else if (S_ISCHR(buf.st_mode))ptr = "character special file";else if (S_ISBLK(buf.st_mode))ptr = "block special file";else if (S_ISFIFO(buf.st_mode)) ptr = "fifo file";#ifdefS_ISLNKelse if (S_ISLNK(buf.st_mode))ptr = "symbolic link";#endif#ifdefS_ISSOCKelse if (S_ISSOCK(buf.st_mode))ptr = "socket";#endifelseptr = "** unknown mode **";printf("%s\n", ptr);}return 0;}分析:用lstat()函数读取文件属性,分别测试一下是不是常规文件、目录文件、字符设备文件、块设备文件、管道文件、连接文件、socket文件,并输出了文件的具体类型。

阅读全文
0 0
原创粉丝点击