文档章节

Linux Bash/C 文件读写相关练习

hakase
 hakase
发布于 2016/10/10 09:49
字数 1120
阅读 13
收藏 0

子任务一 系统文件读写

(1)读取/etc/passwd内容

(2)将/etc/passwd系统文件内容复制到新建文件passwd中

(3)将/etc/passwd系统文件内容一半复制到新建文件passwd_half中

C源代码

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <stdio.h>

#define MAXLINE 80

int main(int argc, char **argv)
{
    int fd1, fd2, n, size = 0;
    char buf[MAXLINE];

    fd1 = open("/etc/passwd", O_RDONLY);
    fd2 = open("passwd", O_WRONLY | O_CREAT);

    while ((n = read(fd1, buf, MAXLINE)) > 0) {
        write(STDOUT_FILENO, buf, n);
        write(fd2, buf, n);
        size += n;
    }

    close(fd1);
    close(fd2);

    fd1 = open("/etc/passwd", O_RDONLY);
    fd2 = open("passwd_half", O_WRONLY | O_CREAT);

    size /= 2;

    while (size > MAXLINE) {
        read(fd1, buf, MAXLINE);
        write(fd2, buf, MAXLINE);
        size -= MAXLINE;
    }
    read(fd1, buf, size);
    write(fd2, buf, size);

    close(fd2);
    close(fd1);

    return 0;
}

python写法

MAXLINE = 80

# os.copy('/etc/passwd', 'passwd')
size = 0
with open('/etc/passwd', 'r') as fd1:
    with open('passwd', 'w') as fd2:
        buf = 'buf'
        while buf:
            buf = fd1.read(MAXLINE)
            print(buf, end='')
            fd2.write(buf)
            size += len(buf)

size = int(size/2)
with open('passwd', 'r') as fd1:
    with open('passwd_half', 'w') as fd2:
        while size > 0:
            if size < MAXLINE:
                buf = fd1.read(size)
            else:
                buf = fd1.read(MAXLINE)
            fd2.write(buf)
            size -= MAXLINE

子任务二 文件内容统计

(1)生成系统软件包名和版本文件

(2) 去除版本号信息

(3) 在一行中显示

(4) 查找带有lsb字样的软件包个数

bash源代码

#!/bin/bash
#

filename=filesystem.manifest

dpkg-query -W --showformat='${Package} ${Version}\n' > $filename

cat $filename | awk '{print $1}' > ${filename}.name

cat ${filename}.name | xargs > ${filename}.name.oneline

cat ${filename}.name | grep "lsb" | wc -l

python写法

import re

filename = 'filesystem.manifest'

with open(filename, 'r') as f:
    lst = f.read().split('\n')
    with open(''.join([filename, '.name']), 'w') as fn:
        for item in lst:
            fn.write(item.split(' ')[0])
            fn.write('\n')


with open(''.join([filename, '.name']), 'r') as fn:
    lst = fn.read().split('\n')
    with open(''.join([filename, '.name', '.oneline']), 'w') as fl:
        for item in lst:
            fl.write(item)
            fl.write(' ')

pattern = re.compile('lsb')
cnt = 0

with open(''.join([filename, '.name', '.oneline']), 'r') as fc:
    lst = fc.read().split(' ')
    for item in lst:
        if pattern.match(item):
            cnt += 1
        
print(cnt)

 

子任务三 文件描述符获取

(1)打印STDIN STDOUT STDERR文件描述符

(2)打开文件a 打印文件描述符

(3)不关闭文件a 定义新的文件描述符重新打开a并打印文件描述符

(4)关闭文件a 定义新的文件描述符重新打开a并打印文件描述符

C源代码

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

int main(int argc, char **argv)
{
    int STDIN = fileno(stdin);
    int STDOUT = fileno(stdout);
    int STDERR = fileno(stderr);
    int fd, newfd;
    FILE *fp;

    fp = fopen("a", "r");
    if (!fp) return -1;
    fd = fileno(fp);

    printf("STDIN: %d\n", STDIN);
    printf("STDOUT: %d\n", STDOUT);
    printf("STDERR: %d\n", STDERR);
    printf("FD: %d\n", fd);

    newfd = open("a", O_RDONLY);
    printf("NEWFD(OPEN): %d\n", newfd);

    fclose(fp);
    newfd = open("a", O_RDONLY);
    printf("NEWFD(CLOSE): %d\n", newfd);

    close(newfd);

    return 0;
}

 

知识: 

标准输入 输出 错误输出 的文件描述符分别为0, 1, 2

打开文件时 操作系统会分配一个文件描述符(从3开始)

多个程序同时打开一个文件时 会分配多个文件描述符

而当文件描述符关闭时 会释放此文件描述符

当有新的文件打开时 再把文件描述符分配给它

 

子任务四 检测文件读写权限

C源代码

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

int main(int argc, char **argv)
{
    int fd, fl, mode;

    fd = open("a", O_RDONLY);

    fl = fcntl(fd, F_GETFL);

    mode = fl & O_ACCMODE;

    if (mode == O_RDONLY) {
        printf("read only\n");
    } else if (mode == O_WRONLY) {
        printf("write only\n");
    } else if (mode == O_RDWR) {
        printf("read write\n");
    } else {
        printf("unknown mode\n");
    }

    return 0;
}

 

子任务五 锁定/解锁文件

C源代码 懒的判断锁状态了

(1) 锁定读 10-30偏移量

(2) 锁定写 40-50 偏移量

(3) 打印相关信息

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

int main(int argc, char **argv)
{
    int fd, fl, stat;
    struct flock lock1;
    struct flock lock2;

    fd = open("/tmp/test_lock", O_RDWR);

    if (fd < 0) {
        printf("open err!\n");
        return -1;
    }

    lock1.l_type = F_RDLCK;
    lock1.l_start = 10;
    lock1.l_len = 20;
    lock1.l_whence = SEEK_SET;

    stat = fcntl(fd, F_SETLK, &lock1);

    if (stat < 0) {
        printf("read lock err !\n");
        return -2;
    } else {
        printf("locking file(read)\n");
    }

    sleep(2);
    printf("process %d closing file\n", getpid());



    lock2.l_type = F_WRLCK;
    lock2.l_start = 40;
    lock2.l_len = 10;
    lock2.l_whence = SEEK_SET;

    stat = fcntl(fd, F_SETLK, &lock2);

    if (stat < 0) {
        printf("write lock err !\n");
        return -2;
    } else {
        printf("locking file(write)\n");
    }

    sleep(2);
    close(fd);
    printf("process %d closing file\n", getpid());

    return 0;
}

 

子任务六 获得/修改文件权限

(1)判断owner others对test01 02 03的读写情况

(2)修改test01 02 03 权限为

rw-rw-r--

rw-rwxr--

rw-rw--w-

C源代码

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

void getPerm(char *filename)
{
    struct stat buf;
    int acc = stat(filename, &buf);
    if (acc < 0) {
        printf("stat err!\n");
        exit(-1);
    }

    if (buf.st_mode & S_IRUSR) {
        printf("owner can read %s\n", filename);
    }
    if (buf.st_mode & S_IWUSR) {
        printf("owner can write %s\n", filename);
    }

    if (buf.st_mode & S_IROTH) {
        printf("others can read %s\n", filename);
    }
    if (buf.st_mode & S_IWOTH) {
        printf("others can write %s\n", filename);
    }

}

int main(int argc, char **argv)
{
    int i;
    char *filename[3] = {
        "test01", "test02", "test03"
    };

    for (i = 0; i < 3; i++) {
        getPerm(filename[i]);
    }

    chmod(filename[0], S_IWUSR | S_IRUSR | S_IRGRP | S_IWGRP | S_IROTH);
    chmod(filename[1], S_IWUSR | S_IRUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH);
    chmod(filename[2], S_IWUSR | S_IRUSR | S_IWGRP | S_IWOTH);

    return 0;
}

 

© 著作权归作者所有

共有 人打赏支持
hakase
粉丝 7
博文 39
码字总数 23663
作品 0
南京
私信 提问
c语言基础学习10_文件操作01

============================================================================= ============================================================================= 涉及到的知识点有: 一......

黑泽明军
2018/01/25
0
0
Linux下shell脚本中信号捕获和函数练习脚本之ping一个网段

该脚本主要的目的是练习在Linux bash脚本中捕获信号,顺便练习一下函数的使用,还有就是终止一个正在运行的程序后,该程序打开的文件的后续处理问题等等! 脚本功能: ping一个网段内的IP,检...

我爱新蔡
2016/11/16
0
0
linux创建用户su登录后显示为 bash-4.1$

今天自己做关于用户配置的练习,之后发现一个问题: su user1之后显示的为: [root@localhost ~]# su user1 -s /bin/bash bash-4.1$ 而不是正常的 [root@localhost ~]# su user1 [user1@loca...

Enthralment
2018/06/27
0
0
6、raid、lvm、while、until 学习笔记

Raid: Level仅用于标识磁盘组合方式的不同 raid0, raid1, raid5, raid10, raid50, jbod raid0:至少需要两块磁盘,不允许任何盘出错,没有容错能力,读写性能都提升,硬盘利用率100% raid1: 至...

开源殿堂
2017/06/27
0
0
Linux命令、文件和目录的常见用法

Linux命令、文件和目录的常见用法 1、 Linux上的文件管理类命令有哪些,其常用的使用方法及其相关示例演示。 1.1、文件权限管理类命令 chown:改变文件所有者 chown [OPTINON]...[OWNRR][:[...

Max_zhao
2017/01/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

移植Modbus到STM32F103(2):移植FreeModbus到usart3并运行示例代码

FreeModbus是Modbus的一个被广泛移植的实现。其源码在github,最新版是1.6。 FreeModbus支持Modbus功能码里的0x01~0x06,0x0F~0x11和0x17,对一些功能比如异常诊断和读事件计数等功能码并没有...

Konstantine
今天
3
0
浅谈神经网络(神经网络篇)

背景 之前写过浅谈神经网络基础篇,简单介绍下机器学习这块内容,用于扫盲。本文正式将神经网络,这部分是深度学习的基础。了解完可以掌握强大的机器学习的方法,也可以更好的了解深度学习。...

Uknowzheng
今天
3
0
移动硬盘变为RAW格式后的修复

在Mac上使用自己的移动硬盘结果文件系统格式变为RAW; 在自己windows笔记本上使用chkdsk H: /F进行修复,修复日志如下: C:\Users\mengzhang6>chkdsk H: /F文件系统的类型是 NTFS。卷标是 do...

晨猫
今天
3
0
10 Git —— 标签管理

10 Git —— 标签管理 本节内容: 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;命令git......

lwenhao
今天
3
0
小程序设置垂直居中,水平居中

如果子容器中的view需要居中的话,那需要在父容器中设置居中 水平居中: display: flex; flex-direction: column; align-items: center; 垂直居中 display: flex;align-items: cen...

淘幻幻
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部