Linux编程

编程实现一个简单的迷你型操作系统文件管理功能模块,基本功能包括:
(1) 显示系统当前用户,当前工作目录。
(2) 显示指定文本文件的内容,文件名称由键盘输入。
(功能类似命令 cat aa.txt )
(3) 显示指定文件的名称,大小,权限等信息,文件名称由键盘输入。
(功能类似命令 ls –l aa.txt )
(4) 文件复制功能,源文件,目标文件名均由键盘输入
(功能类似命令cp aa.txt bb.txt )
(5)创建文件功能(文本文件)
(功能类似命令touch aa.txt )

#include <stdio.h>
#include <sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<syslog.h>
#include<string.h>
#include<stdlib.h>
#include<dirent.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<utmp.h>
#include<pthread.h>
#define MAX  1000
void show_info(struct utmp* utbufp)
{
    if(utbufp->ut_type!=USER_PROCESS)
    return;
    printf("%-8.8s", utbufp->ut_name);
    printf(" ");
    printf("%-8.8s", utbufp->ut_line);
    printf(" ");
    printf("(%s)", utbufp->ut_host);
    printf("\n");
}
int main()
{
  int fd,fd1,fd2,utmpfd,num,choice,del,i;
  struct utmp current_record;
  int reclen = sizeof current_record;
  int n=0;
  char buffer[MAX],file[20],file1[20],file2[20];
  char *buff=NULL;//定义一个指针用来指向复制的内容
  struct stat statbuf={0};
  while(1)
  {
    printf("\n**************************************\n");
    printf("0. 	退出系统\n");
    printf("1.  查看系统当前用户\n");
    printf("2.  显示系统当前目录\n");
    printf("3. 	创建文件\n");
    printf("4.  输入文件内容\n");
    printf("5. 	查看文件内容\n");
    printf("6. 	显示文件信息\n");
    printf("7. 	文件复制功能\n");
    printf("8. 	删除文件\n");
    printf("**************************************\n");
    printf("请选择相关操作:");
    scanf("%d",&choice);
  switch(choice)
  {
      case 0:  exit(0);
      case 1:  
         if ((utmpfd = open(UTMP_FILE, O_RDONLY)) == -1)
    {
        perror(UTMP_FILE);
        exit(1);
    }
    while (read(utmpfd, &current_record, reclen) == reclen)
    {
        show_info(&current_record);
    }
    close(utmpfd);
    break;
    case 2:
       if(NULL==getcwd(buffer,MAX))
       perror("getcwd"); 
       printf("当前目录为:%s\n",buffer);       
     break;
     case 3:  
       printf("请输入要创建的文件名:\n");
       scanf("%s",file);
       fd=open(file,O_WRONLY,0644);
       if(fd==-1)
       printf("文件创建失败");
       else
       printf("文件创建成功");
      break;
      case 4:
        printf("请输入要打开的文件名:\n");
        scanf("%s",file);
        fd = open(file,O_WRONLY);
        if(fd==-1)
        { 
           printf("文件打开失败,请检查是否存在!:\n");
        }
        else
        {
            printf("请输入文件内容,长度小于128个字符:\n");
            num = read(0,buffer,MAX);
            write(fd,buffer,num);
            printf("文件输入成功!\n");
       }
       break;
      case 5:
          printf("请输入要打开的文件名!\n");
          scanf("%s",file);
          fd = open(file,O_RDONLY,0750);
          if(fd==-1)
          { 
           printf("文件不存在!\n");
          break;
          }
          num = read(fd,buffer,MAX);
          printf("文件内容为\n");
          write(1,buffer,num);
      break;
      case 6:
          printf("输入想要查看的文件名\n");
          scanf("%s",file);
          if((lstat(file,&statbuf))==-1){
                perror("stat fail");
                exit(1);
            }
           switch (statbuf.st_mode & S_IFMT) {
           case S_IFBLK:  printf("b");            break;
           case S_IFCHR:  printf("c");            break;
           case S_IFDIR:  printf("d");            break;
           case S_IFIFO:  printf("p");            break;
           case S_IFLNK:  printf("l");            break;
           case S_IFREG:  printf("-");            break;
           case S_IFSOCK: printf("s");            break;
           default:       printf("?");            break;
           }
           //打印文件类型
         char f_mode[10]={0};
         char tmp_buf[]="rwxrwxrwx";
         for(i=0;i<9;i++)
         {
                 if(statbuf.st_mode & (1<<(8-i)))
                         f_mode[i]=tmp_buf[i];
                 else
                         f_mode[i]='-';
         }
         printf("%s ",f_mode);
			//打印文件权限
         printf("%ld ",statbuf.st_nlink);
			//打印硬链接数
         struct passwd *uid=getpwuid(statbuf.st_uid);
         struct group  *gid=getgrgid(statbuf.st_gid);
         printf("%s %s\t",uid->pw_name,gid->gr_name);
			//打印所有者和所属组
         printf("%8ld ",statbuf.st_size);
         struct tm *t=gmtime(&(statbuf.st_atime));
         printf("%d月  %d %d:%d ",t->tm_mon,t->tm_mday,t- >tm_hour,t->tm_min);
			//打印访问日期
         if((statbuf.st_mode& S_IFMT)==S_IFLNK){
                 char sym_buf[50]={0};
                 readlink(file,sym_buf,sizeof(sym_buf));
                 printf("%s -> %s",file,sym_buf);
         }
         else
                 printf("%s",file);
             //打印文件名
        printf("\n");
        break;
    case 7:
      printf("输入想要复制的源文件和目标文件\n");
      scanf("%s %s",file1,file2);
      fd1=open(file1,O_RDWR);//可读可写,打开源文件     
      int size=lseek(fd1,0,SEEK_END);//将光标定位到源文件的尾部,目的计算源文件的大小
      lseek(fd1,0,SEEK_SET);//将光标定位到源文件的头部,从头读取内容
      buff=(char *)malloc(sizeof(char)*size+8);//开辟buff的内存空间
      int n_read=read(fd1,buff,size);//将源文件的内容读取出来
      fd2=open(file2,O_RDWR|O_CREAT,0600);//打开副本,没有则新建副本
      int n_write=write(fd2,buff,size);//将内容复制到副本 
      close(fd1);
      close(fd2);
      break;
    case 8:
      printf("输入要删除的文件名:\n");
      scanf("%s",file);
      fd = open(file,O_RDONLY,0750);
      if(fd==-1)
        { 
          printf("文件不存在\n");
        }
      int ret = unlink(file);   
      printf("文件删除成功\n");    
      if(ret < 0)
       {
        perror("删除失败");
       }
     break;
     default :
     break;
}
}
}  

程序运行截图如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值