linux高级编程实验2

实验一
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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值