我要成为嵌入式高手之2月19日Linux高编第四天!!

这篇具有很好参考价值的文章主要介绍了我要成为嵌入式高手之2月19日Linux高编第四天!!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

练习

练习1:利用read和write实现文件内容的拷贝(将src.jpg中的内容拷贝到dst.jpg文件中)

#ifndef _HEAD_H
#define _HEAD_H

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

#endif
#include "head.h"

int main(int argc, const char *argv[])
{
    int src = 0;
    int dst = 0;
    char tmpbuff[4096] = {0};
    ssize_t nret = 0;

    if (argc != 3)
    {
        fprintf(stderr,"Usage: ./a.out srcfilename dstfilename\n");
        return -1;
    }
    
    src = open(argv[1], O_RDONLY);
    if (src == -1)
    {
        perror("fail to open src");
        return -1;
    }

    dst = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0664);
    if (dst == -1)
    {
        perror("fail to open dest");
        return -1;
    }

    while(1)
    {
        nret = read(src, tmpbuff, sizeof(tmpbuff));
        if (nret == 0)
        {
            break;
        }
        write(dst, tmpbuff, nret);
    }

    close(src);
    close(dst);

    return 0;
}

新知识点:主函数传参,在编译之后运行的时候将参数传入主函数

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

参数:

        argc:要传的参数个数

        argv:要传的参数的首地址(char* 型)

        cahr *argv[ ]:存放要操作的文件的地址的数组(指针数组)

练习2:1028 人口普查 - PAT (Basic Level) Practice (中文) (pintia.cn)

 文章来源地址https://www.toymoban.com/news/detail-827622.html

#include "head.h"

typedef struct person
{
    char name[8];
    char birthday[12];
}person_t;

int main(void)
{
    person_t a[100000];
    int n = 0;
    int i = 0;
    int cnt = 0;
    char maxvalue[12] = {"2014/09/06"};
    char minvalue[12] = {"1814/09/06"};
    int curmax = 0;
    int curmin = 0;

    scanf("%d",&n);

    for (i = 0; i < n; ++i)
    {
        scanf("%s%s",a[i].name,a[i].birthday);
    }

    for (i = 0; i < n; ++i)
    {
        if (strcmp(a[i].birthday,maxvalue) <= 0 && strcmp(a[i].birthday,minvalue) >= 0)
        {
            cnt++;

            if (cnt == 1)
            {
                curmin = curmax = i;
            }

            if (strcmp(a[i].birthday,a[curmax].birthday) > 0)
            {
                curmax = i;
            }

            if (strcmp(a[i].birthday,a[curmin].birthday) < 0)
            {
                curmin = i;
            }
        }
    }

    printf("%d %s %s\n",cnt,a[curmin].name,a[curmax].name);

    return 0;
}

学习笔记

 一、文件IO

lseek

off_t lseek(int fd, off_t offset, int whence);
功能:重新设定文件描述符的偏移量

参数:

        fd:文件描述符

        offset:偏移量

        whence:开始偏移的位置

                SEEK_SET        文件开头

                SEEK_CUR        文件当前位置

                SEEK_END        文件末尾

返回值:成功返回当前偏移量,失败返回-1;

#include "head.h"

int main(void)
{
    int fd = 0;
    off_t len = 0;
    char ch = 0;

    fd = open("a.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);
    if (-1 == fd)
    {   
        perror("fail to open");
        return -1;
    }

    len = lseek(fd, 10, SEEK_SET);
    printf("len = %ld\n",len);
    ch = 'A';
    write(fd, &ch, 1);

    len = lseek(fd, -5, SEEK_CUR);
    printf("len = %ld\n",len);
    ch = 'B';
    write(fd, &ch, 1);
    
    len = lseek(fd, 0, SEEK_SET);
    printf("len = %ld\n",len);
    ch = 'C';
    write(fd, &ch, 1);

    close(fd);

    return 0;
}

二、目录IO

1、mkdir

#include <sys/stat.h>
#include <sys/types.h>

int mkdir(const char *pathname, mode_t mode);

        功能:创建目录文件

        参数:

                pathname:文件路径

                mode:文件的权限

                rwx  rwx  rwx:x目录是否能进入 w目录是否能新建文件 r目录是否能查看文件

                111 111 111

                 0 7   7    7

        返回值:成功返回0,失败返回-1:

#include "head.h"

int main(void)
{
    mkdir("dir11",0777);
    
    return 0;
}

2、rmdir

#include <unistd.h>

int rmdir(const char *pathname);

功能:删除空目录文件

返回值:成功返回0,失败返回-1

3、opendir

#include <sys/types.h>
#include <dirent.h>

DIR *opendir(const char *name);  (DIR *  目录流指针)

功能:打开目录,获得目录流指针

参数:

        name:目录文件的路径

返回值:成功返回目录流指针,失败返回空

4、closedir

#include <sys/types.h>

#include <dirent.h>

int closedir(DIR *dirp);

功能:关闭目录流指针

5、readdir

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

功能:从目录流中读取下一个目录项的结构体信息

参数:dirp 目录流指针

返回值:

        成功返回包含目录项信息的空间首地址

        失败或者读到文件末尾返回NULL

struct dirent {
               ino_t          d_ino;               /* Inode number */(标号)
               off_t          d_off;                 /* Not an offset; see below */(偏移量)
               unsigned short d_reclen;    /* Length of this record */(大小)
               unsigned char  d_type;       /* Type of file; not supported(文件类型)
                                                              by all filesystem types */
               char           d_name[256];    /* Null-terminated filename */(包含了一个 \ 0 的文件名)
           };

3、4、5使用:

#include "head.h"

int main(void)
{
    DIR *dp = NULL;
    struct dirent *pp = NULL;

    dp = opendir("dir");
    if (dp == NULL)
    {
        perror("fail to opendir");
        return -1;
    }

    while (1)
    {
        pp = readdir(dp);
        if (pp == NULL)
        {
            break;
        }

        if (*pp->d_name == '.')
        {
            continue;
        }
        printf("%s\n",pp->d_name);
    }
    closedir(dp);

    return 0;
}

6、chdir  

#include <unistd.h>

int chdir(const char *path);

功能:切换到path目录工作路径(改变路径)

7、getcwd  

#include <unistd.h>

char *getcwd(char *buf, size_t size);

功能:获得当前目录的绝对路径

6、7使用

#include "head.h"

int main(void)
{
    char tmpbuff[4096] = {0};

    getcwd(tmpbuff,sizeof(tmpbuff));
    printf("tmpbuff = %s\n",tmpbuff);

    chdir("..");
    getcwd(tmpbuff,sizeof(tmpbuff));
    printf("tmpbuff = %s\n",tmpbuff);

    return 0;
}

练习1(难):

递归遍历 

#include "head.h"

int ListDir(const char *pdirname)//遍历pdirname目录下所有文件的信息
{
    DIR *dp = NULL;//接收opendir返回的一个dir型指针
    struct dirent *pp = NULL;//接收readdir返回的结构体
    char tmpbuff[4096] = {0};

    dp = opendir(pdirname);
    if (NULL == dp)
    {
        perror("fail to opendir");
        return -1;
    }

    while (1)
    {
        pp = readdir(dp);
        if (NULL == pp)
        {
            break;
        }

        if ('.' == *pp->d_name)
        {
            continue;
        }

        sprintf(tmpbuff, "%s/%s", pdirname, pp->d_name);
//要读的文件夹的名字和该文件夹下所有文件的名字,组合而成就是路径,将该路径存入tmpbuff中
        printf("%s\n",tmpbuff);

        if (pp->d_type == DT_DIR)//D_TYPE文件类型,文件类型为DT_DIR(文件夹类型)时,再次调用函数
        {
            ListDir(tmpbuff);//递归调用
        }
    }
    closedir(dp);

    return 0;
}

int main(int argc, const char *argv[])
{
    if (argc != 2)
    {
        fprintf(stderr,"Usage: ./a.out dirname\n");
        return -1;
    }

    ListDir(argv[1]);

    return 0;
}

6、accsee

#include <unistd.h>

int access(const char *pathname, int mode);

功能:检测调用函数的程序对文件是否拥有指定权限

参数:

        pathname:文件路径

        mode:

                R_OK        是否拥有读权限

                W_OK        是否拥有写权限

                X_OK        是否拥有执行权限

                F_OK        是否存在

返回值:有该权限返回0,没有返回-1;

#include "head.h"

int main(int argc,const char *argv[])
{
    int ret = 0;

    if (argc != 2)
    {
        fprintf(stderr,"Usage: ./a.out filename\n");
        return -1;
    }

    ret = access(argv[1],F_OK);
    if (ret == 0)
    {
        printf("该文件存在!\n");
    }else
    {
        printf("该文件不存在!\n");
    }

    return 0;
}

 练习2(难):

        编写一个程序,分两次执行,第一次执行后,再次执行时打印出两个执行过程中间,指定目录下新增的文件及删除的文件

 

到了这里,关于我要成为嵌入式高手之2月19日Linux高编第四天!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实时嵌入式Linux设备基准测试快速入门3实时嵌入式Linux

    计算机系统与环境之间的交互通常是实时发生的,因此,对于作为计算机系统一部分的嵌入式设备来说,有关实时操作系统的讨论也是一个重要话题。 本章将讨论实时系统的特点,介绍在Linux嵌入式设备上实现实时性的主要方法。具体来说,本章将重点分析PREEMPT_RT内核补丁,

    2024年02月15日
    浏览(50)
  • 关于嵌入式开发的一些信息汇总:嵌入式C开发人员、嵌入式系统Linux

    这篇文章是关于嵌入式开发的一些基本信息,供想入行的人参考。有一些作者本人的想法,以及来自外网的大拿的文章翻译而来,原文链接在此Learning Linux for embedded systems,再次感谢,支持原创。 普通C开发人员和嵌入式C开发人员之间的 基本区别在于 ,因为嵌入式C程序被设

    2024年02月03日
    浏览(65)
  • 嵌入式开发:单片机嵌入式Linux学习路径

    SOC(System on a Chip)的本质区别在于架构和功能。低端SOC如基于Cortex-M架构的芯片,如STM32和NXP LPC1xxx系列,不具备MMU(Memory Management Unit),适用于轻量级实时操作系统如uCOS和FreeRTOS。高端SOC如基于Cortex-A架构的芯片,如三星、高通、飞卡、全志和瑞芯微等,具备MMU,支持虚拟内

    2024年02月15日
    浏览(54)
  • 嵌入式Linux系统组成

    1.产品 发行版Linux系统产品:服务器、消费平板、消费手提电脑 嵌入式Linux系统产品:扫地机器人,小米机顶盒特定场景使用 2.硬件 X86 PC电脑主板为例:要想让电脑运行发行版系统,要有主板,主板上要有CPU,DDR,电源,无线/有线硬件,显示单元、存储以及其他外设等 嵌入式

    2024年02月14日
    浏览(41)
  • 嵌入式学习之linux

    今天,主要对linux文件操作原理进行了学习,主要学习的内容就是对linux文件操作原理进行理解。写的代码如下:  

    2024年02月11日
    浏览(48)
  • 嵌入式 Linux 安全简介

    安全就是降低风险。 一方面所有者,即产品或服务的受益者(用户、制造商、企业主等)。所有者希望保护资产,即产品或服务中任何有价值的东西(数据、代码、声誉等)。 另一方面威胁行为者,即能够表现出威胁的人或事物(恶意黑客等),即任何能够以可能造成伤害

    2024年02月08日
    浏览(44)
  • 嵌入式Linux开发教程汇总

    野火:https://doc.embedfire.com/products/link/zh/latest/linux/index.html 正点原子:http://47.111.11.73/docs/boards/arm-linux/index.html 百问网:http://download.100ask.net/books/Linux/ELADCM1/index.html 百问网:https://space.bilibili.com/275908810/channel/seriesdetail?sid=1714177 野火:https://space.bilibili.com/356820657/channel/seriesdeta

    2024年02月10日
    浏览(60)
  • 嵌入式软件学习--linux(1)

     echo $PATH   查看环境变量 。若在,可执行 ;若不在,1.将当前路径添加到环境变量 2.将文件移动到环境变量的路径中         sudu gedit /etc/environment          PATH=\\\"/usr/local/sbin/:/usr/local/sbin/: /home/ccc \\\"         重启系统或重新登陆         vim ~/.bashrc            

    2024年04月29日
    浏览(43)
  • 嵌入式开发之linux内核移植

    目录  前言 一、下载内核源码 1.1 下载linux-3.0.1 1.2 解压源码文件 二、 内核添加yaffs2文件系统支持 2.1 下载yaffs2 2.2 内核添加yaffs2文件补丁 三、配置开发板 3.1 修改机器ID 3.2 添加开发板初始化文件 3.3 配置NandFalsh 3.3.1 添加NandFlash设备 3.3.2 添加NandFlash驱动 3.3 修改Kconfig(支持

    2024年02月07日
    浏览(99)
  • 嵌入式Linux开发-USB驱动

    哥们马上就要被裁了,总得整理一下技术方面的积累,准备开始下一轮的面试和找工作之旅了。。。。 通用串行总线(USB)是主机和外围设备之间的一种连接。 从拓扑上来看,是一颗由几个点对点的连接构建而成的树。这些连接是连接设备和集线器(hub)的四线电缆(底线、电源线

    2024年02月20日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包