Linux Bash/C 文件讀寫相關練習

子任務一 系統文件讀寫python

(1)讀取/etc/passwd內容bash

(2)將/etc/passwd系統文件內容複製到新建文件passwd中操作系統

(3)將/etc/passwd系統文件內容一半複製到新建文件passwd_half中code

C源代碼orm

#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寫法get

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

子任務二 文件內容統計it

(1)生成系統軟件包名和版本文件io

(2) 去除版本號信息form

(3) 在一行中顯示class

(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;
}
相關文章
相關標籤/搜索