review: 如果想在开机时挂载文件需要在fstab上添加挂载设备!
LVM:(逻辑卷管理)
PV(physical volume 物理卷:来源的设备空间)
VG(volume group 由PE组成的空间)
LV(logical volume真实使用的由VG分配的空间)
创建LVM:
1.fdisk n 出空间
2.fdisk t 修改Hex code (输入L显示所有code) LVM 的code是8e
3.partprobe 重载分区
4.pvcreate </dev/.. (设备路径)>
5.pvdisplay : 显示pv的信息
6.vgcreate -s <16M : PE大小> <vg0 : 卷组名> <设备名 : /dev/..>
7.vgdisplay
8.lvcreate -L <大小 : 1G> -n <lv0 : 设备名> <vg0 : 分配的卷组名>
9.lvdisplay
10.mkfs.xfs </dev/vg0/lv0 : 设备名>
可执行的操作 lvextemd -L <扩展后的空间 : 2G> <设备名 : /dev/vg0/lv0>
要进行刷新才识别到新的 xfs_growfs <设备名>
C语言开始:
file <文件> : 查看文件类型
echo $? 显示上一次操作的返回值
vim 编辑器
gcc 编译器
编译步骤:
总和步骤: gcc hello.c -o hello
1.预处理 gcc -E <源码文件 *.c> -o <*.i> 对头文件的全部展开(包括各种拓扑关系) 同时进行宏定义以及擦除注释
2.编译 gcc -S <预处理文件 *.i> -o <*.s> 汇编代码
3.汇编 gcc -c <汇编代码文件 *.s> -o <*.o> 二进制代码可以与别的二进制代码进行重定向 (file中信息有 relocatable : 可重定向的)
4.链接 gcc <汇编二进制代码 *.o> -o <可执行文件名>
linux下ELF是指二进制文件
函数类型:
1.可变参函数
2.递归函数
3.泛型编程
推荐书籍:《C语言接口与实现》
上课内容:
/*************************************************************************
> File Name: class.c
> Author: khalil
> Mail: [email protected]
> Created Time: Sat 17 Oct 2015 02:36:53 PM CST
************************************************************************/
#if 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char * my_strcpy(char *dest_str,const char * src_str);
char * my_strncpy(char *dest_str,const char * src_str,size_t n);
int main(int argc , char ** argv)
{
char *str = "hello,world!~~~~~";
char str2[100] = {0};
char str3[100] = {0};
char str4[100] = {0};
//把字符串str的内容拷贝到str2
// strcpy(str2,str);
// my_strcpy(str2,str);
my_strncpy(str3,str,50);
// printf("%s\n",str2);
// printf("%s\n",str3);
printf("%d\n",strlen(str3));
// my_strncpy(str4,str,3);
// printf("%s\n",str4);
return 0;
}
char * my_strcpy(char *dest_str,const char * src_str)
{
//1.检测传入参数
//2.实现拷贝
//3.返回dest地址
//
//不建议对传入的指针参数直接进行使用
char * dest = dest_str;
const char * src = src_str;
if (dest_str == NULL || src_str == NULL || dest_str == src_str)
{
return dest_str;
}
while((*dest++ = *src++) != '\0'){
}
return dest_str;
}
char * my_strncpy(char *dest_str,const char * src_str,size_t n)
{
char * dest = dest_str;
const char * src = src_str;
size_t i = 0;
if (dest_str == NULL || src_str == NULL || dest_str == src_str)
{
return dest_str;
}
for ( ; (i < n)&&(*src) ; i++)
{
*dest++ = *src++;
}
for( ; i < n ;)
{
*dest++ = '\0';
}
return dest_str;
}
#endif
#if 0
int main (int argc , char ** argv)
{
int i = 0 ; //操作符两边用空格隔开
int a = 10 , b = 20 ; //不建议,每行只对一个变量赋值
//要注意缩进
return 0 ;
}
#endif
#if 0
//注释的三种方式:
// 1.单行注释 //
// 2. 块注释 /**/
// 3.条件注释
// #if (1|0)
// #endif
//
// 关键字(系统可以识别的,系统自带的)和标识符(用户创建的名字)
// Tip: C语言中有32个关键字!
//
// 1.标识符由数字字母下划线组成,必须以字母下划线开始
// 2.常见的命名规范:
// (1): int ListNode; //Win ver
// int List_node; //Linux ver -推荐使用!
// (2): 要求:见名识义
// (3): 用最少的字母表示出最大的含义!
//
#endif
#if 0
//*.c 实现功能的文件
// 在/usr/lib中存在它的编译后代码
// *.o是静态库 *.so是动态库
// 一般情况下 使用者只能获得.c编译后的文件
//
//*.h 功能说明文件
//
//linux内核
//
//1.编程规范
//
//字符串要注意特殊字符,以及他们strlen中的长度
//要注意/的转义作用
//
#include<stdio.h>
#include<string.h>
//可以通过 man <函数名> 来查看它的头文件
int main(int argc , char ** argv)
{
char string[] = {"hello,world!"};
printf("%d",strlen(string));
printf(string);
return 0;
}
#endif
#if 0
#include<stdio.h>
//提高程序的局部性
int main(int argc , char **argv)
{
int array[] = {12,123,213,213,21,3,213,21,312,3};
int arr_len = sizeof(array) / sizeof (array[0]);
//不要在循环语句中进行计算 会降低程序的效率
int i = 0;
for (i = 0 ; i < arr_len ; ++i){
printf("%d\n",array[i]);
}
return 0 ;
}
#endif
#if 0
#include<stdio.h>
int main(int argc , char ** argv){
int flag ;
scanf("%d" , & flag);
if (flag == 0){
printf("---Hello , World!---\n");
return 0;
}else{
printf("---Nope! You're wrong!---\n");
return 1;
}
}
#endif