实验一
1.创建文件file1,写入字符串“abcdefghijklmn”;
2.创建文件file2,写入字符串“ABCDEFGHIJKLMN”;
3.读取file1中的内容,写入file2,使file2中的字符串内容为“abcdefghijklmn ABCDEFGHIJKLMN”
创建file1,file2 文件
/*************************************************************************
> File Name: IO_open.c
> 作者:YJK
> Created Time: 2019年09月08日 星期日 19时58分23秒
************************************************************************/
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
int main(int argc,char *argv[])
{
int IO_OPEN,IO_OPEN_1;//文件描述符
int write_num1,write_num2=-1;
char *buf="abcdefghijklmn";
char *buf2="ABCDEFGHIJKLMN";
if(argc<3)
{
printf("ERROR!number<3\n") ;
return -1;
}
IO_OPEN=open(argv[1],O_CREAT|O_RDWR,0755);
if(IO_OPEN==-1)
{
perror("open");
return -1;
}
IO_OPEN_1=open(argv[2],O_CREAT|O_RDWR,0755);
if(IO_OPEN_1==-1)
{
perror("open");
return -1;
}
write_num1=write(IO_OPEN,buf,strlen(buf));
write_num2=write(IO_OPEN_1,buf2,strlen(buf2));
close(IO_OPEN);
close(IO_OPEN_1);
return 0;
}
实现file1中的字符串写入file2中
/************************************************************************
> File Name: IO_file_rw.c
> 作者:YJK
> Created Time: 2019年10月10日 星期四 11时21分46秒
***********************************************************************/
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
int fd,fd2=-1;
int rd_num,rd_num2,wt_num=-1;
char buf[128]={0};
char buf1[128]={0};
if(argc<3)
{
printf("ERROR!\n");
return -1;
}
if((fd=open(argv[1],O_RDONLY))==-1)//以读写方式打开file1
{
perror("open");
return -1;
}
if((fd2=open(argv[2],O_RDWR))==-1)//打开file2
{
perror("open");
return -1;
}
rd_num=read(fd,buf,128);
rd_num2=read(fd2,buf1,128);
/* 先将file2 文件中的字符串向后移动rd_num(file中的字符串长度)个位置*/
lseek(fd2,rd_num,SEEK_SET);
write(fd2,buf1,rd_num2);
lseek(fd2,0,SEEK_SET);
write(fd2,buf,rd_num);
/* lseek(fd2,0,SEEK_SET); //先将file1中的字符串写入file2 再将file2中的字符串追加到后面
write(fd2,buf,rd_num);
write(fd2,buf1,rd_num2);*/
return 0;
}
实现过程
1.创建file1,file2 文件,并将字符串写入文件中
2.实现
实验二
编写代码,完成以下功能:
1.创建新文件,该文件具有用户读写权限。
2.采用dup/dup2/fcntl复制一个新的文件描述符,通过新文件描述符向文件写入“class_name”字符串;
3.通过原有的文件描述符读取文件中的内容,并且打印显示;
IO_file.c文件源码
/************************************************************************
> File Name: IO_file.c
> 作者:YJK
> Created Time: 2019年9月10日 星期四 20时50分55秒
***********************************************************************/
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<sys/stat.h>
int main(int argc,char *argv[])
{
int fd=-1;
int fd2=-1;//新的文件描述符
int wrnum,rdnum=0;
char *buf="移动一班--袁俊珂--1815925428\n";
char buf1[128]={0};
umask(0);//修改umask值
fd=open(argv[1],O_CREAT|O_RDWR,0600);
if(fd==-1)
{
perror("open");
return -1;
}
//复制文件描述符
fd2=dup(fd);//选取未被使用的最小的文件描述法
// fd2=dup2(fd,5);//使用指定的文件描述符 如果该文件描述符已被使用则关闭该文件描述符 重新使用
// fd2=fcntl(fd,F_DUPFD,1);//实现文件描述符复制,选择大于等于1的未被使用的文件描述符
wrnum=write(fd2,buf,strlen(buf));//使用新的文件描述符写入字符串
if(wrnum==0)//如果写入失败
{
perror("write");
return -1;
}
//此时文件指针位于文件末尾
lseek(fd,0,SEEK_SET);//将文件指针指向文件开始
rdnum=read(fd,buf1,128);//使用老的文件描述符将文件中的信息读取到buf1中
if(rdnum==0)
{
perror("read");
return -1;
}
printf("%s",buf1);//打印出读取的字符串
return 0;
}
实验三
编写程序实现以下功能:
1.输入文件名称,能够判断文件类型,判断实际用户对该文件具有哪些存取权限;
2.要求打印出文件类型信息,inode节点编号,链接数目,用户id,组id,文件大小信息;
3.修改文件的权限为当前用户读写,组内用户读写,组外用户无权限。
IO_stat.c源码
/************************************************************************
> File Name: IO_stat.c
> 作者:YJK
> Created Time: 2019年9月10日 星期四 10时31分36秒
***********************************************************************/
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
/*
*判断文件权限,文件类型....
*
*
* */
int main(int argc,char *argv[])
{
unsigned int i,mask=0700; //111 000 000
struct stat buf;
char *ptr;
static char *BUF[]={"---","--x","-w-","-wx","r--","r-x","rw-","rwx"};
if((stat(argv[1],&buf))==-1)
{
perror("stat");
return -1;
}
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="char dev file ";
else if(S_ISBLK(buf.st_mode))//是否为块设备文件
ptr="block file ";
else if (S_ISFIFO(buf.st_mode))//是否为管道文件
ptr="FIFO file ";
printf("%s:%s ",argv[1],ptr);
for(i=3;i;--i)
{
printf("%3s",BUF[(buf.st_mode&mask)>>(i-1)*3]);
/*
* 假设st.mode 0777 111 111 111
* i=3时对拥有者权限进行 字符转换
* (buf.st_mode&mask)>>(i-1)*3
111 111 111&111 000 000 -> 111 000 000=256
111 000 000>>6 -> 000 000 111 = 7
BUF[7]="rwx"
*/
mask>>=3;
/*
111 000 000>>3 -> 000 111 000
*/
}
printf("inode=%ld nlink=%ld uid=%d gid=%d size=%ld \n",buf.st_ino,buf.st_nlink,buf.st_uid,buf.st_gid,buf.st_size);
if(chmod(argv[1],S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)==-1)//将文件权限修改为拥有者可读写、组用户可读写
{
perror("chmod");
return -1;
}
return 0;
}
实验四
编写程序实现以下功能:
1.新建文件,设置文件权限屏蔽字为0;
2.建立该文件的硬链接文件,打印硬链接文件的inode节点号和文件大小;
3.建立该文件的软链接文件,打印软链接文件的inode节点号和文件大小;打印软链接文件中的内容;
4.打印源文件的inode节点号,文件大小和链接数目;
5.调用unlink对源文件进行操作,打印源文件链接数目;
IO_link.c源码
/************************************************************************
> File Name: IO_link.c
> 作者:YJK
> Created Time: 2019年9月13日 星期日 14时50分21秒
***********************************************************************/
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
int main(int argc,char *argv[])
{
int fd_c;
umask(0);
struct stat buf;
char BUF[128]={0};
if(fd_c=creat(argv[1],0755)==-1)
{
perror("create");
return -1;
}
if(link(argv[1],"hard_linkfile")==-1)//创建硬链接
{
perror("link");
return -1;
}
if(lstat("hard_linkfile",&buf)==-1)//读取硬链接文件属性
{
perror("lstat");
return -1;
}
printf("hard_linkfile_inode=%ld,size=%ld\n",buf.st_ino,buf.st_size);//打印硬链接信息
if(symlink(argv[1],"sym_linkfile")==-1)//创建软连接
{
perror("symlink");
return -1;
}
if(lstat("sym_linkfile",&buf))//读取软连接文件属性
{
perror("lstat");
return -1;
}
if(readlink("sym_linkfile",BUF,sizeof(BUF))==-1)//读取软连接文件内容
{
perror("readlink");
return -1;
}
printf("sym_linkfile_inode=%ld,size=%ld,read=%s\n",buf.st_ino,buf.st_size,BUF);
if(stat(argv[1],&buf)==-1)//读取源文件属性
{
perror("fstat");
return -1;
}
printf("%s: inode=%ld,size=%ld,nlink=%ld\n",argv[1],buf.st_ino,buf.st_size,buf.st_nlink);
if(unlink(argv[1])==-1)
{
perror("unlink");
return -1;
}
if(fstat(fd_c,&buf)==-1)//读取源文件属性
{
perror("stat");
return -1;
}
printf("%s:new_nlink=%ld\n",argv[1],buf.st_nlink);
close(fd_c);
return 0;
}
实验五
1.新建/home/user目录;
2.把当前工作路径移至/home/user目录;
3.打印当前工作路径;
IO_cdir.c源码
/************************************************************************
> File Name: IO_cdir.c
> 作者:YJK
> Created Time: 2019年9月13日 星期日 18时26分53秒
***********************************************************************/
#include<stdio.h>
#include<dirent.h>
#include<unistd.h>
#include<sys/stat.h>
int main(int argc,char *argv[])
{
char buf[128]={0};
if(mkdir(argv[1],0777)==-1)
{
perror("mkdir");
return -1;
}
chdir(argv[1]);
if(getcwd(buf,128)==NULL)//获取当前路径
{
perror("getcwd");
return -1;
}
printf("%s",buf);
return 0;
}
实验六
编写程序完成以下功能:
1.递归遍历/home目录,打印出所有文件和子目录名称及节点号。
2.判断文件类型,如果是子目录,继续进行递归遍历,直到遍历完所有子目录为止。
/************************************************************************
> File Name: IO_dirread.c
> 作者:YJK
> Created Time: 2019年9月13日 星期日 20时40分56秒
***********************************************************************/
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<dirent.h>
#include<sys/stat.h>
#include<string.h>
int main(int argc,char *argv[])
{
int dir_read(const char *str);
dir_read(argv[1]);
return 0;
}
int dir_read(const char * str)
{
struct stat buf;
struct dirent *dirp=NULL;
DIR *dir=NULL;
char BUF[512]={0};
if((dir=opendir(str))==NULL)
{
perror("opendir");
return -1;
}
while((dirp=readdir(dir))!=NULL)
{
sprintf(BUF,"%s/%s",str,dirp->d_name);//获取目录的绝对路径
if(dirp->d_name[0]=='.')//跳过隐藏文件
continue;
if(stat(BUF,&buf)==-1)//需要使用绝对路径
{
perror("stat");
return -1;
}
if(S_ISDIR(buf.st_mode))//如果当前文件为目录,则递归查看其子目录
{
printf("%s %ld\n",BUF,dirp->d_ino);
dir_read(BUF);
}
else
{
printf("%s %ld \n",dirp->d_name,dirp->d_ino);
}
}
closedir(dir);
}