要求将当前路径下,所有文件的权限及最后一次的访问时间提取出来,写入到fie.txt中

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
#include <time.h>

int main(int argc, const char *argv[])
{
    // 打开文件夹
    DIR* op = opendir("./");
    struct stat buf;
    if (NULL == op)
    {
        perror("opendir");
        return -1;
    }

    FILE* fp = fopen("file.txt", "w");
    if (NULL == fp)
    {
        perror("fopen");
        return -1;
    }

    printf("目录打开成功\n");

    // 读取文件夹
    struct dirent* rp = NULL;
    while ((rp = readdir(op)) != NULL)
    {
        if (strcmp(rp->d_name, ".") == 0 || strcmp(rp->d_name, "..") == 0)
        {
            continue;
        }

        if (stat(rp->d_name, &buf) < 0)
        {
            perror("stat");
            return -1;
        }
    }

    rewinddir(op);

    while ((rp = readdir(op)) != NULL)
    {
        if (strcmp(rp->d_name, ".") == 0 || strcmp(rp->d_name, "..") == 0)
        {
            continue;
        }

        if (stat(rp->d_name, &buf) < 0)
        {
            perror("stat");
            return -1;
        }
		//S_IRWXU表示与的读写执行权限
		//S_IRWXG组用户
		//S_IRWXO其他用户
        struct tm* t = localtime(&buf.st_ctime);
        fprintf(fp, "%s %o %d-%02d-%02d %02d:%02d:%02d\n",\
				rp->d_name, buf.st_mode & (S_IRWXU | S_IRWXG |S_IRWXO),\
				t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,\
				t->tm_hour, t->tm_min, t->tm_sec);
    }

    // 关闭文件夹
    if (closedir(op) < 0)
    {
        perror("closedir");
        return -1;
    }

    fclose(fp);
    printf("数据已写入到file.txt文件中\n");

    return 0;
}

使用文件IO对图片进行拷贝。要求子进程拷贝后半部分,父进程拷贝前半部分。
提示:
1.图片就是一个普通文件,
普通文件怎么拷贝,图片就怎么拷贝。读一个字符,写一
个字符,循环size/2次
2.diff可以查看两个文件是否一致,例如diff 1.png 2.png,可以查看两张图片是否

终端输入: eog 1.png 可以打开1.png这张图片

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, const char *argv[])
{
    int fd1, fd2;
    pid_t pid;
    off_t size, half_size; // 文件大小和一半大小

    // 打开输入文件
    fd1 = open("./1.jpg", O_RDONLY);
    if (fd1 < 0) {
        perror("open");
        return -1;
    }

    // 获取文件大小和一半大小
    size = lseek(fd1, 0, SEEK_END);
    half_size = size / 2;

	// 创建输出文件
	/*O_RDWR: 表示以读写模式打开文件。这意味着可以对文件进行读取和写入操作。
		O_CREAT: 如果文件不存在,则创建文件。如果文件已经存在,则不会进行任何操作。
		O_TRUNC: 如果文件已经存在,并且以写入模式打开,则截断文件为零长度。这意味着文件内容将被清空。
	 * */
	fd2 = open("./2.jpg", O_WRONLY | O_CREAT | O_TRUNC, 0644);
	if (fd2 < 0) {
		perror("open");
		return -1;
	}

    // 创建子进程
    pid = fork();

    if (pid < 0) {
        perror("fork");
        return -1;
    } 
	if (pid == 0) { // 子进程拷贝后半部分
        lseek(fd1, half_size, SEEK_SET);

        char buffer[1];
        for (off_t i = half_size; i < size; i++) {
            if (read(fd1, buffer, 1) != 1) {
                perror("read");
                return -1;
            }

            if (write(fd2, buffer, 1) != 1) {
                perror("write");
                return -1;
            }
        }
    } else { // 父进程拷贝前半部分
        size = half_size;

        char buffer[1];
        for (off_t i = 0; i < size; i++) {
            if (read(fd1, buffer, 1) != 1) {
                perror("read");
                return -1;
            }

            if (write(fd2, buffer, 1) != 1) {
                perror("write");
               return -1;
            }
        }
    }

    close(fd1);
    close(fd2);

    if (pid > 0) {
        wait(NULL); // 等待子进程结束
    }

    printf("拷贝完成\n");

    return 0;
}
02-29 22:15