0 Linux 前言
1 Linux 文件读写
2 Linux 文件属性
3 Linux 目录操作
4 Linux 系统部分基础概念
5 Linux 进程初探
6 Linux 进程间通信(IPC)
7 Linux 守护进程
8 Linux 线程
9 Linux 网络编程中的部分基础概念
10 Linux TCP简单通信
11 Linux I/O多路复用
12 Linux UDP简单通信
13 Linux 广播和组播
14 Linux 本地套接字 (可进程间通信)
注: 基于Ubuntu的Linux C记录
1.更换apt镜像源
2.安装编译工具
sudo apt install build-essential cmake
3.CMakeLists.txt
模板
cmake_minimum_required(VERSION 3.1)
project(demo)
add_compile_options(-std=c11 -Wall -Werror -Wextra -pedantic -Wimplicit-fallthrough -Wsequence-point -Wswitch-default -Wswitch-unreachable -Wswitch-enum -Wstringop-truncation -Wbool-compare -Wtautological-compare -Wfloat-equal -Wshadow=global -Wpointer-arith -Wpointer-compare -Wcast-align -Wcast-qual -Wwrite-strings -Wdangling-else -Wlogical-op -Wconversion -Wno-pedantic-ms-format)
include_directories(.)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
aux_source_directory(. src)
add_executable(demo ${src})
target_link_libraries(demo PRIVATE Threads::Threads)
4.Linux C手册安装
sudo apt install manpages manpages-de manpages-de-dev manpages-dev
sudo apt install manpages-posix manpages-posix-dev
sudo apt install linux-doc
5.部分常用命令简述
命令 | grep |
参数 | grep -rn "[查找的内容]" ([路径]) 在指定路径下查找指定的内容,若有则列出文件名及所在行的内容以及在对应文件中的行号. (省略路径,则查当前工作路径) |
grep -rl "[查找的内容]" ([路径]) 列出含有查找内容的文件名 |
|
命令 | find |
参数 | find [路径] -name "[查找的名字]" |
find [路径] -type [文件类型] 普通文件 f 目录 d 符号链接 l 管道 p 套接字 s 字符设备 c 块设备 b |
|
find [路径] -size [文件大小] + 大于 - 小于 单位: k 千字节, M 兆字节 |
|
atime 最后访问的时间 mtime 内容最后修改的时间 ctime 文件属性最后修改的时间 +n n天以前 -n n天以内 |
|
maxdepth 最深层数 mindepth 最浅层数 |
|
-exec [shell命令] {} \; -ok [shell命令] {} \; 管道 | xargs [shell命令] |
命令 | netstat |
参数 | -a 显示所有选项, 默认不显示 LISTEN 相关 |
文件名 | |
-p 显示建立相关连接的程序名 | |
-n 拒绝显示别名, 能显示数字的全部转化为数字 | |
-t (TCP) 仅显示TCP相关的选项 | |
-u (UDP) 仅显示UDP相关的选项 | |
-l 仅列出有在 Listen (监听) 的服务状态 | |
静态库 | 库文件命名 | libxxx.a 前缀(lib) + 库名(xxx) + .a |
编译生成 | 将代码生成目标文件(.o): gcc -c xxx.c 将目标文件打包为静态库: ar rcs libxxx.a xxx.o |
|
动态库 | 命名 | libxxx.so 前缀(lib) + 库名 + .so |
编译生成 | gcc -shared -fPIC -o libxxx.so xxx.c | |
调用 | gcc -I [头文件所在目录] -L [库文件所在目录] -l[库名] -o [生成二进制的文件名] xxx.c |
后记
我与Linux之缘
2017年高一后的暑假,七月的时候,因为接触到易语言,对"编程"起了兴趣. 八月份开始的时候,在网上查阅信息,了解到了C语言,当时对编程还没什么系统的概念,看网上很多人说用Linux学C语言好,就对Linux起了好奇心,想试一试. 来回的查,最终选定了银河麒麟(就是一个基于Ubuntu衍生的"国产"系统),然后开始作死的尝试安装,试图搞Windows和Linux的双系统, 把下载的镜像烧录到U盘,然后准备安装,安装不成还把引导弄坏了. 试图凭着U盘中烧录的镜像安装也不成,想装Windows也不行,家里只有那台笔记本,没法制作安装盘. 不过好在烧录的镜像还有一个 Live 模式, 可以用U盘启动,但是每次启动之前做的修改就没了. 这样通过Live模式,以一种奇怪的方式用了差不多半年的Linux, 这是后话. 在八月入Linux后,我也不断查阅资料,怎么写C语言,最开始是用的银河麒麟上预装的Qt Creator, 后面懂了些,开始换成vim编辑,然后配合gcc编译. 回想当时也确实挺懵的,当时还遇到一个问题卡过我几天,就是编译好的程序 a.out , 但是直接在终端输 a.out 回车却不能执行, 之后找了一本感觉不错的C语言书(也是基于Linux终端的), 才知道原来还要加个 ./ .八月后面的那十天左右就天天抄那本书上的案例程序执行, 到开学的时候,我也对C语言有大概的了解了,可以不需要书简单的写写了.而在这个时间段,对Linux也有了更多了解了,基本的常用命令没什么问题了,不知道就查,越用越熟. 从那以后我在编程中就基本无法离开Linux了,也是一种喜好. 有一段是Windows和Linux混合用,Windows 10支持Linux子系统, 2020年(Windows 10 2004)推出了WSL2,很多之前不能正常运行的UI程序也可以正常用了,前不久又直接把我电脑系统换成了Ubuntu 20.04.
附注:
关于函数空参数和显式void声明无参数的简述
在C
中,自定义函数在不需要参数的情况下,括号内留空
和显式声明void
其实是不同的,在采用留空的方式下定义一个函数,代表的是不限定参数个数.比如你定义了一个函数 void fun() {}
,调用的时候,你可以当作无参数fun();
,也可以 fun(6);
fun('c');
fun(1, 4, 7);
fun("1f", 5);
,编译器是不会报错的. 但是如果你定义函数时显式声明无参数: void fun(void)
, 那么调用的时候就只能使用 fun();
而在C++
中,两种情况是等效的, 因为C++中存在函数重载, 只能依靠参数不同来区别, 不可能将 void fun() {}
和 void fun(void) {}
视作重载,调用的时候都是用留空的方式代表不传入参数,无法区别
对于我,在C中,凡是无参数我都会显式声明 void , 在C++中就留空