Linux i/o操作

  1. 设计一个程序,要求打开文件“pass”,如果没有这个文件,新建此文件,权限设置为只有所有者有已读权限

//打开函数

open(const char* pathname,int flags), int open(const char *pathname, int flags, mode_t mode); 

 pathname:要打开的文件名(含路径,缺省为当前路径) 

flags:  O_RDONLY 只读打开         O_WRONLY 只写打开         O_RDWR  可读可写打开

可以选择加上O_CREAT 若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。

文件描述符fd=0是标准输入  fd=1是标准输出 fd=2是标准错误

#include<stdio.h>

#include<fcntl.h>
#include<stdlib.h>
int main()
{
      int fd;//定义一个文件描述符

      if(fd=open("./pass",O_CREAT|S_IRUSR,0400)<0)
    {
      printf("打开文件失败,需要重新创建");
    }
      else
      {
              close(fd);
      }
      system("ls ./pass -l");
      return 0;

}

  1. 设计一个程序,要求新建一个文件“hello”,利用write函数将“Linux下c软件设计”字符串写入该函数

strlen()函数读取字符串长度

#include<stdio.h>

#include<fcntl.h>
#include<unistd.h>
int main()
{
        int fd;
        char *str="Linux下c软件设计";
        fd=creat("./hello",S_IWUSR|S_IRUSR);
        if(fd<0)
        {
        printf("创建失败");
        }
        else{
                write(fd,str,strlen(str));
        }
        system("cat ./hello");
        return 0;
}
~

3.设计一个程序,要求利用read函数读取系统文件“/etc/passwd”,并在终端显示输出

 STDOUT_FILENO可以用文件描述符 标准输出1表示

#include<stdio.h>

#include<unistd.h>
#include<fcntl.h>

int main()
{
        int fd;
      //打开文件
        fd=open("/etc/passwd",O_RDONLY);
        char *buf;
        int n;
//读取文件
       while((n=read(fd,buf,80))>0)
        {
//写文件  STDOUT_FILENO可以用文件描述符 标准输出1表示
        write(STDOUT_FILENO,buf,n);
        }
        close(fd);


        return 0;
}

  1. 设计一个程序,要求打开文件pass,如果没有这个文件,新建此文件,在读取系统文件“/etc/passswd”,把文件中的内容都写入“pass”文件中

//打开源文件,写入目标文件

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>

int main()
{
        int fd;
        fd=open("./pass",O_CREAT|O_WRONLY,0600);
        if(fd<0)
        {
                printf("打开文件错误,需要重新创建");

        }
        int source;
        source=open("/etc/passwd",O_RDONLY|O_WRONLY);
        int n;
        char *buf;
        while((n=read(source,buf,80))>0)
        {
        write(fd,buf,n);
        }
        return 0;
        }

  1. 设计一个程序,要求为“bin/ls/”文件建立一个软链接“ls1”和一个硬链接“ls2”,并查看两个链接文件和“/bin/ls“文件。
#include<stdio.h>
#include<unistd.h>


int main()
{
        symlink("bin/ls","ls1");
        //硬链接创建时源文件必须存在,不许给目录创建应链接
        link("bin/ls","ls2");
        system("ls ls1 -l");
        system("ls ls2 -l");
        system("ls /bin/ls -l");
        return 0;
}
  1. 编程实现ls的基本功能,并实现-l参数功能;如:
    1. 若没指定目录则显示当前目录的所有可见文件;
    2. 若指定目录,参数指定问文件显示该文件信息,若为目录则显示该目录中的的文件信 息;
    3. -l参数格式同ls -l;
    4. 指定目录可以是多个;
#include<stdio.h>

#include<unistd.h>

#include<stdlib.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<string.h>

#include<time.h>

#include<pwd.h>

#include<grp.h>

void filebuf(mode_t mode,char *rs){ //判断文件类型以及所有者,组和其他的权限;

        if(S_ISDIR(mode)){

                rs[0]='d';

        }

        else if(S_ISREG(mode)){

        rs[0]='-';

        }

        else if(S_ISFIFO(mode)){

        rs[0]='p';

        }

        else if(S_ISLNK(mode)){

                rs[0]='l';

        }

        else if(S_ISBLK(mode)){

                rs[0]='b';

        }

        else if(S_ISSOCK(mode)){

                rs[0]='s';

        }

        else if(S_ISCHR(mode)){

                rs[0]='c';

        }

    if(mode & S_IRUSR)  rs[1]='r';

    else rs[1]='-';

    if(mode & S_IWUSR)  rs[2]='w';

    else rs[2]='-';

    if(mode & S_IXUSR)  rs[3]='x';

    else rs[3]='-';

    if(mode & S_IRGRP)  rs[4]='r';

    else rs[4]='-';

    if(mode & S_IWGRP)  rs[5]='w';

    else rs[5]='-';

    if(mode & S_IXGRP)  rs[6]='x';

    else rs[6]='-';

    if(mode & S_IROTH)  rs[7]='r';

    else rs[7]='-';

    if(mode & S_IWOTH)  rs[8]='w';

    else rs[8]='-';

    if(mode & S_IXOTH)  rs[9]='x';

    else rs[9]='-';

    rs[10]='\0';

}

int main(int argc, char *argv[]) {

        struct stat fst;

        struct tm *mytime=(struct tm *)malloc(sizeof(struct tm));

        char rs[12];

        if(argc!=2){

        fprintf(stderr,"Usage: %s <pathname>\n",argv[0]);

        exit(EXIT_FAILURE);

        }

        if(stat(argv[1],&fst)==-1)

    {

        perror("stat");

        exit(EXIT_FAILURE);

    }

    filebuf(fst.st_mode,rs);

    printf("%s",rs); //输出文件类型与权限信息;

    printf(" %d",fst.st_nlink);//输出文件的硬链接数;

    printf(" %s",getpwuid(fst.st_uid)->pw_name);//输出所属用户名;

    printf(" %s",getgrgid(fst.st_gid)->gr_name);//输出用户所在组;

    printf(" %1d",fst.st_size);//输出文件大小;

    mytime=localtime(&fst.st_mtime);//获取文件修改时间;

    printf("%d-%02d-%02d%02d:%02d",mytime->tm_year+1900,mytime->

tm_mon+1,mytime->tm_mday,mytime->tm_hour,mytime->tm_min);

    printf(" %s",argv[1]);//输出文件名;

    printf("\n");

    return 0;

}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值