Be Me in Real Life

做自己,笑不羁

1.pton

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>


int main()
{
char* addr = "192.168.1.2";
int buf[4];
inet_pton(AF_INET,addr,(void*)&buf);
unsigned char *p = (unsigned char*)buf;
printf("%d %d %d %d\n",p[0],p[1],p[2],p[3]);

//下面为什么错误?
//unsigned char *buf[4];
//inet_pton(AF_INET,addr,(void*)&buf);
//printf("%d %d %d %d\n",buf[0],buf[1],buf[2],buf[3]);
return 0;
}
阅读全文 »

1.线程的概念

在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体。进程为了完成一定的工作,必须包含至少一个线程。

进程拥有资源,而线程基本上不拥有资源,只有一点在运行中必不可少的资源(程序计数器、寄存器和栈),但可以和同一进程的其他线程共享进程的资源。

进程是CPU分配资源的最小单位,而线程是CPU调度的最小单位

如果说进程是一个资源管家,负责从主人那里要资源的话,那么线程就是干活的苦力。一个管家必须完成一项工作,就需要最少一个苦力,也就是说,一个进程最少包含一个线程,也可以包含多个线程。苦力要干活,就需要依托于管家,所以说一个线程,必须属于某一个进程。

阅读全文 »

1.学习目标

  • 说出并理解管道的读写行为
  • 熟练使用pipe进行父子进程间通信
  • 熟练使用pipe进行兄弟进程间通信
  • 熟练使用fifo进行无血缘关系的进程间通信
  • 熟练掌握mmap函数的使用
  • 使用mmap进行有血缘关系的进程间通信
  • 使用mmap进行无血缘关系的进程间通信
阅读全文 »

1.学习目标

  • 掌握目录遍历相关的函数使用
  • 了解进程相关的概念
  • 掌握fork/getpid/getppid函数的使用
  • 熟练掌握ps/kill命令的使用
  • 熟练掌握execl/execlp函数的使用
  • 说出什么是孤儿进程和僵尸进程
阅读全文 »

这一节只学习了一部分,放弃了一些文件操作函数。因为感觉自己目前最需要学的是系统等相关的东西(进程间通信、线程、soket等),学怎么用这些函数也不难。

1.系统调用

程序等,通过统一系统调用接口来进行对内核资源的使用。这样做是为了保护系统资源。

shell、库函数、应用程序都可以进行系统调用。但不是所有操作都需要进行系统调用,例如字符串处理,不需要系统调用即可实现。

为了实现权限控制和资源保护,操作系统分为了两种运行级别:用户态内核态。用户态下的进程访问受限,而内核态没有限制,如驱动程序等。通过系统中断,实现用户态和内核态之间的切换。

阅读全文 »

1) 有两个互不相干的文件a.c和b.c,编写Makefile之后,make生成可执行文件a和b。

deng@itcast:~/share/3rd/homework/2makefile$ ls

a.c b.c Makefile

deng@itcast:~/share/3rd/homework/2makefile$ make

deng@itcast:~/share/3rd/homework/2makefile$ ls

a a.c a.o b b.c b.o Makefile

deng@itcast:~/share/3rd/homework/2makefile$ ./a

hello a

deng@itcast:~/share/3rd/homework/2makefile$ ./b

hello b

代码如下:

阅读全文 »

是什么

跨平台开源库,支持Windows,Android,ios等。

功能

处理音视频,具体包括:音视频源接入、输出、处理

开发语言

C语言

阅读全文 »

编码encode

通过压缩技术,将原始音视频格式的文件转换成另一种视频格式文件,目的是减少字节,进行压缩。

为什么会需要压缩?

因为视频中每一帧都是一张图片,各个帧之间存在很大相似,如果不压缩,文件将会很大

如:将YUV420/422格式的视频编码为 H264格式的视频

image-20210604203624412

输入是一个图片(像素的集合,像素的格式为YUV420等),在ffmpeg中叫做frame。

阅读全文 »

  1. 调用Lambda函数

    Lambda函数只是对函数的定义和声明,但无法进行调用,只能通过函数指针来实现。

1
2
3
4
5
6
//方式一:函数指针
void (*fp) () = [](){cout<< "Hello World!";};
fp();

//方式二:通过Lambda函数后面添加()直接运行。
[](){cout<< "Hello World!";}();
  1. QT的信号和槽中,使用函数指针来避免重载导致的信号和槽多义性。
1
2
3
4
5
6
7
8
//方式一:函数指针
void (teacher::*hungeryFun)(QString) = &teacher::hungery;
void (student::*treatFun)(QString) = &student::treat;
connect(tea,hungeryFun,stu,treatFun);
//方式二:强制static_cast类型转换
connect(tea,
static_cast<void (teacher::*)()>(&teacher::hungery),stu,
static_cast<void (student::*)()>(&student::treat));

12-1 项目的整体UI架构

宏:

如下的Q_OBJECT、Q_PROPERTY等。

其中Q_OBJECT宏的作用是启动Qt元对象系统的一些特性(如支持型号和槽等),它必须放置到类定义的私有区。

阅读全文 »
0%