天天看点

linux 文件编程操作 线程操作

目录

    • 项目开发日报表
    • 课堂笔记

项目开发日报表

项目名称 【苏嵌实训-嵌入式 linux C 第 7 天】
今日进度 以及任务 1.嵌入式linuxC编程 2.文件编程 3.多任务编程 线程
本日任务完成情况
本日开发中出现的问题汇总
本日未解决问题
本日开发收获 了解了嵌入式为什么要移植操作系统,creat/open/read/write/lseek/close的使用方法,还有线程的概念和基本操作创建和退出等
其他

课堂笔记

  • 嵌入式为什么要移植操作系统:

    1.提高软件移植性

    2.操作系统提供多任务操作

    3.操作系统提供丰富的网络协议栈

    4.将所有设备抽象成文件,方便访问设备

  • 用户如何访问内核空间?

    系统调用 。内核提供安全的访问内核的数据及服务的接口:系统调用

  • 用户如何系统调用?

    调用系统提供的编程函数接口——API(用户编程接口)

  • 文件编程

    文件描述符的分配方式:动态分配,0,1,2这三个文件描述符已被系统占用,有特殊作用

  • API
  • creat(文件描述符,文件权限)成功返回文件描述符,失败返回-1
  • open

    O_APPEND: write from end

    O_CREAT,0655:没有的话新建,要加一个权限参数

    O_WRONLY:只读写

  • close(fd)
  • write( fd, *buf , count )不能写进去整形数字 需要5+‘0’
  • read( fd, *buf , count )
  • lseek(fd , offset , whence)先把fd移到头 再一10个SEEK_SET

    SEEK_CUR:

  • 向文件中写入三行,再一行一行读出来
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>


int main(int argc,char *argv[])
{
    if(argc!=2)
    {
        printf("Please input file name!\n");
        exit(1);
    }

    int fd=creat(argv[1],0655);
    if(fd == -1)
    {
        perror("creat file is failed!");//print error
        exit(1);
    }
    printf("creat success:%d\n",fd);

    if((fd = open(argv[1],O_RDWR|O_APPEND))<0)//O_APPEND: write from end
    {
        perror("open file is failed!");//print error
        exit(1);
    }
    else
    {
        printf("open file success:%d\n",fd);
    }

    char *buf[3]={"aaaa","bbbb","cccc"};
    for(int i=0;i<3;i++)
    {
        //write(fd,buf[i],sizeof(buf[i]));
        write(fd,buf[i],4);
        write(fd,"\n",1);
    }

    lseek(fd,0,SEEK_SET);
    for(int i=0; i<3;i++)
    {
        read(fd,buf[i],5);
        printf("%s\n",buf[i]);
    }

    close(fd);
    return 0;
}
           

程序运行结果:

linux 文件编程操作 线程操作
  • 多任务 线程

    多任务:当前CPU是单核 并发不并行。

  • 线程操作
  • Int pthread_create( 线程ID,线程属性,线程函数void *( *start_routine )(),线程函数传参 )
  • 被动退出:pthread_cancle 线程不发生系统调用就没法用cancle结束线程
  • 主动退出:pthread_exit( void *retval ) Return
  • Join ( ID,**retval ) 等别的线程结束后退出
  • Return 不会弹出栈 Pop cancle exit 会弹栈
  • 两个子线程操作
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>

#define MAX_SIZE 1024
int i=0;

void * thread1(void *arg)
{
    while(1)
	{
        i++;
        printf("i= %d\n",i);
        sleep(2);
    }   
}
void * thread2(void *arg)
{
    while(1)
    {
        printf("ok\n");
        sleep(2);
    }
}
int main()
{
    pthread_t id1;
    pthread_create(&id1,NULL,thread1,NULL);

    pthread_t id2;
    pthread_create(&id2,NULL,thread2,NULL);

    pthread_join(id1,NULL);
    pause();

    return 0;
}