子任務一 系統文件讀寫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; }