Linux指令学习

本文详细介绍了C语言的基础知识,如指针、数据流、文件操作,并深入探讨了Linux环境下的函数使用,如open、write等。同时,涵盖了进程间通信的多种方式,如管道、消息队列、共享内存。此外,文章还讲解了Git的使用,包括提交、推送、拉取等操作。最后,简述了TCP服务端和客户端的编程实现,展示了网络编程的基本概念。
摘要由CSDN通过智能技术生成

yy  p复制粘贴

cd目录

diff比较,cp之后,diff test1.c test2.c       touch建文件        ctrl+c退出死

缓存:用户——库缓存——内核 >>>>>>>>>加\n调用库缓存  四种:\n   内存满了  调用了系统函数    fflush:刷新缓存,将用户缓存写到内核缓存   stderr无缓存   stdout直接写

FILE数据流

2023.1.4   C语言

register 尽量将变量限制在寄存器,访问迅速

const 修饰只读变量 

n%m ==>>  [0 ~ m-1]可以用来求数

if()   while()    ()里面非0都是真

<<左移是乘法   m<<1    m*2      m<<n   m*2^n

>>右移   -1负数右移永远不会变成空

11111111(补码)   当成-1

A|1=1   A&0=0      a | (0x1<<n)第n位设置为1     清除:a=a & (~(0x1<<5))可移植性好

*p 指针变量    char *p 一次读一个字节    int *p一次读四个字节 这个数据类型就是指针读取方法

&a取地址,门牌号的最小值,最小地址

2023.1.5 C语言

char *p 一看就想到字符串

const char *p    字符串  指针变量,指向不同地址但是里面内容不可以变化,只读

char *p当成const char *p

char * const p 指向固定地址,内容可以变化   硬件资源

const char * const p  地址不能变,内容不能变

结构体指针

struct stu
{
int num;
char *name;//字符串

}boy1 = {   };

struct stu *pst;
pst = &boy1;

printf(   ,  boy1.num  boy1.name);
             (*pst).num  (*pst).name;
             pst->num   pst->name;//三种都可以

静态链表,都有一个指针指向下一个,例如:struct stu a,b,c,*head

head = &a;    head = head->next;

a.next=&b;

b.next=&c;

动态链表,p1在前面走,p2在后面追,p1到后面之后,将p2的next指向p1,p2是连接前后的作用

cp -l test1 test4 硬连接    ls -il索引结点号是一样的 原文件没了依然保留数据

cp -s test1 test5 软连接  索引结点号不同                原文件没了就没了

ls -l test1

grep -v t test1        在test1中搜索与t不匹配的

grep [tf] test1,正则表达式,搜索包含t和f的字符串

gzip   gunzip   gzcat压缩相关

2023.1.6 Linux函数 write.c  open.c  cp.c  fopen.c  fread.c  fputs.c

gcc -c hello.c 编译生成hello.o文件
gcc -o hello hello.c 生成可执行文件hello  或者  gcc hello.c -o hello

Open:  fd = open( “ mm ”,  O_RDONLY | O_CREAT,0755)//只读,没有就创建,-1失败,其他成功,权限

Close:close(fd)

perror(“why”)随便写,打印出来

strcpy ( writebuff , test ) ,字符串复制,将test复制到writebuff

write( fd , &writebuff[0] , 11)文件描述符,首地址,数据长度,写的是内存,char *p 首地址就是p,字符串长度就是strlen(str);  字符串有\0多加一位

write read ,往fd所指的里面写,从fd所指的里面读 ,read返回值是读取的字节数

open(O_APPEND)  和   lseek(SEEK_END)光标移到最后  lseek可以负数

argc 有多少参数 ,   argv  字符串数组

ndd,删除光标下几行

数组初始化:memset(buffer  ,   0   ,128);初始化空间,将已经开辟的buffer的128个空间赋为0

标准IO可移植性强于文件IO,fopen是标准IO   头文件stdio.h

FILE类型的指针fp  

fread(readbuff , 4,2,fp)将fp对应的东西读到readbuff去

fwrite(writebuff, 4,1,fp)将writebuff里面东西写到fp对应里面

2023.1.7 Makefile   fork.c

fgets 读,会将\n一起读入,gets不会

fp文件标识符,文件指针,fp当成一个代号,指代一个东西

fprintf(fp,xxxxxxxx),将xxxxx写到fp指代的文件里面

sprintf(buf , "xxxx")将xxxx字符串写到buf里面

静态库,首先将.c编译成.o,再将.o  通过ar cr编译成libxxx.a,gcc hello.c -o hello ./libtest.a 生成执行文件a.out ,再执行./hello可以验证

动态库,gcc -shared -fPIC -o libtest.so test.c,将.c编译成.so加-shared -fPIC

比如sub求和是一个库,调用它,就是自建.h头文件

gcc -o main main.c -L. -lfifile 编译 main.c 就会把静态函数库整合进 main
静态库在编译时,动态库在运行时载入
Makefile:    目标(我们想生成的.0或者a.out):依赖文件
                        命令
                        命令
生成这个目标,需要这些依赖,有了依赖了,通过下面的命令来生成目标。
.o根据规则更新和重建

2023.1.9 Makefile

makefile,第一个目标文件是最终目标    .i  ---> .s   --->  .o   --->  可执行文件

gcc -c xxxx.c -o xxxx.o  汇编

.PHONY: 定义伪目标关键字

.PHONY:
clear:
    rm -rf xxx

        :=  恒等于

TAR = test
OBJ = circle.o cube.o
CC := gcc
test : circle.o cube.o
    gcc -c circle.o cube.o -o test
//替换
$(TAR) :$(OBJ )
    $(CC) -c $(OBJ ) -o $(TAR )

%.c %.o代表任意的.c .o      *.c *.o所有的.c .o

%.c :%.o
    $(CC) -c %.c -o %.o

$@所有的目标文件,$^所有的依赖文件

父子进程执行fork的不同代码段

ps aux | grep xxx

kill -l     

2023.1.10 git操作

提交到版本库

git status     暂存区状态

git add xxxx.xx(没有就touch创建文件,然后vi文件写入东西)

git commit -m "备注"    把暂存区的改动提交到库里面

git push origin master 同步文件到云库(推送)

git init 初始化

git remote add origin 加网址

git push origin master 推送上去

git fetch从远程拉取代码             git fetch+git merge = git pull

git branch   有*master   *代表目前处于的分支

~home目录  当前目录  ..上级目录

 Remote是远程仓库,Repository是本地仓库,workspace是自己的项目工作区,在工作区的项目进行add(添加)、commit(提交)、push(发送)等操作至远程仓库,若有新更新的内容,需要在push之前先从远程仓库pull(拉)下来 更新的内容,再进行push到远程仓库 。

git add -A 保存所有的修改
git add . 保存新的添加和修改,但是不包括删除
git add -u 保存修改和删除,但是不包括新建文件

2023.1.11  pipe.c  mkfifio,c mkpipe.c  msg.c msg_tx.c   msg_rx.c

僵尸进程,用wait   waitpid阻塞,等待子进程

dup2(oldfd,newfd)  将oldfd内容重定向到newfd,就是把oldfd的指向复制一份到newfd(原来newid指向的文件被关闭),如此一来,再向newfd写输入就如同向oldfd写输入一样了。

exit(0)  默认0表示正常退出

ipcs -q查看消息队列     system(ipcs -q)系统函数,在运行时自动运行ipcs -q

route 命令用于显示和操作IP路由表;

rx tx进程间通信

2023.1.12  msg_service.c  msg_client.c   shm.c  my_ipcrm,c  shm_tx.c  shm_rx.c  kill.c

%3d表示取三位整数;

ipcs是Linux下显示进程间通信设施状态

ipcs -m,显示活动的共享内存信息

ipcm  删除ipc(清除共享内存信息)

stdin标准输入,从键盘输入

extern void *memcpy(void *dest, void *src, unsigned int count);    由src所指内存区域复制count个字节到dest所指内存区域

C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

如果返回值 < 0,则表示 str1 小于 str2。

如果返回值 > 0,则表示 str2 小于 str1。

如果返回值 = 0,则表示 str1 等于 str2。

atoi把字符串转换为整数   ii=atoi("123abc"); printf("ii=%d\n",ii); // 输出ii=123,合法数字后的abc被忽略。

建立IPC通讯,需要指定一个id找到对应的消息队列、共享内存,成功就返回一个key_t值,就是两者拴在一起的纽带,ftok

./a.out a b argv[]就有三个,参数,argc是参数个数

argv[0]就是./a.out

argv[1]就是a

argv[2]就是b

参数个数包括程序名本身,argv数组也包含程序名并将它作为第一个元素,其中argc是程序参数的个数,argv是一个代表参数自身的字符串数组

2023.1.13  sem.c  pv.c

pid_t wait(int* wstatus);    若不关心进程的结束状态(结束原因)时,可以传NULL进去!

alarm函数,alarm(7)倒计时7秒,这7秒执行主函数,signa(14,myfun); 7秒到了之后执行myfun函数,再回到主函数

ipcs

ipcs -a :显示全部可以显示的信息    all

ipcs -q:显示活动的消息队列信息            queue

ipcs -m:显示活动的共享内存信息    memory  share

ipcs -s:显示活动的信号量信息         semget

ipcrm -m id:删除共享内存标识   

ipcrm -q id :删除消息队列标识 id和其相关的消息队列和数据结构

ipcrm -s id:删除信号标识符id和其相关的信号量集及数据结构

ipcrm -M key:删除由关键字创建的共享内存标识

ipcrm -Q key:删除由关键字key创建的消息队列和其相关的消息队列和数据结构

ipcs -S key:删除由关键字key创建的信号量标识及其相关的信号量集及数据结构

ftok(把一个已存在的路径名和一个整数标识符转换成IPC键值,key)

malloc申请完内存后要判断是否成功

常量==,在等号前面

进程杀死自己:exit(1);

                        kill(getpid(),SIGKILL);

                        raise(SIGKILL)

守护进程,fork父亲死,子进程创建会话操作,pid_t setid(void)

chomd a+x g+w  所有+可执行  组内+可写

a代表所有用户;

g代表同组用户;

o代表其他用户;

rm -i:进行任何删除操作前必须先确认。   alias rm='rm-i'  用后面的名字代替前面的名字

ln(link files)命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接

普通用户的标识符为:$

root用户的标识符为:#

2023.1.16  pthread.c    pthread_exit.c   pthread_uncle.c

(int *)ptr强制转化,是个地址,*(int *)ptr取地址

线程的回调函数看一下

线程分离属性,1.初始化   2.设置参数  3.在创建中让它自带分离属性

互斥锁:让访问变成串行,同时只有一个线程可以访问,假如p可以,赋值q=p,则q不能访问

原子操作就是: 不可中断的一个或者一系列操作, 也就是不会被线程调度机制打断的操作

读写锁,读的时候锁起来,写的时候锁起来,写的优先级更高,读的时候可以加锁,写的时候独占,读写锁:

        读:并行
        写:串行

tar -zcvf 目标文件 源文件

z表示使用gzip压缩

j表示使用bzip2压缩

c表示压缩

x表示解压缩

逗号运算符返回值是最后的表达式的值

  1. printf("%3.10s\n",a); //这里m虽然取值为3,但是n的值大于m,所以取值n,保证n个字符输出

  2. printf("%12.3s\n",a); //输出" myn"注意,n取的是元素个数,不包括空格链接

    A:ls是list的缩写,用来显示当前目录下面文件的信息;

    B:df是disk free的缩写,用来显示文件系统中不同磁盘的使用情况;

    C:du是disk usage的缩写,显示当前目录或者当前文件的占用的块大小;

    D:find命令作用在目录下,用来查找指定目录或者当前目录下的文件。

2023.1.17  条件变量  信号量pthread_cond.c   shell  socket_tcp.c

rand()%1000;//0-999 

注意结构体数组要在定义时就直接初始化

对于未初始化的数据如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL

如果是数组:   struct Student stu[10];   就是   memset(stu,0,sizeof(struct Student)*10);

 pthread_cond_wait  , 将已经上锁的mutex解锁该函数解除阻塞,对互斥锁加锁

信号量:消费者阻塞,生产者生产减减给消费者使用资源,消费者再返还资源给生产者,加加

IP 地址为 32 为(Ipv4)或者 128 位(Ipv6)
git命令合并代码:(1)git merge;(2)git pull;(3)git cherry-pick

产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

# Shell常见的变量之一系统变量,主要是用于对参数判断和命令返回值判断时使用,系统变量详解如下:

$0         当前脚本的名称;
$n         当前脚本的第n个参数,n=1,2,…9;
$*         当前脚本的所有参数(不包括程序本身);
$#         当前脚本的参数个数(不包括程序本身);
$?         令或程序执行完后的状态,返回0表示执行成功;
$$         程序本身的PID号。

perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备 (stderr) 。

2023.1.18  socket_tcp.c  client.c   一个客户端一个服务端

TCP服务端,先建立socket,再bind绑定信息,然后listen监听,再accept接收,最后recv,接收读写数据

2023.1.29 git 分布式  .拉取分支,分支名简明摘要说要干什么,然后干活,在合并到master,合并之后在删除分支,这是基本步骤,不需要留额外分支,分支只是为了将来看代码时方便而已,能看到这个分支是干什么的。

xxx = 123.456f   float    %6.2f  一共六位包括小数点和两位小数

int a[10] = { [2] = 3,[6]=9, [9] = 4};

long n     printf(&ld,n);

master 主仓库,分支随便迭代,只有提交才算主仓库改动

1.mkdir xxx    2. cd xxx   3.git init 初始化 4.新建文件  touch  5.git add提交缓存  6.git commit -m "提交描述"   6.git log查看日志    7.git reset  回滚  git reset -hard +ID   8. git status 查看仓库状态9.  git checkout -- file.c  回到上次修改状态  10.git rm text.c    使用git rm删除文件,但是也需要使用git commit提交一次      11.git checkout -b dev  ==  git branch dev 创建分支并且跳转过去   git branch查看分支  git branch master 切换到master  12.git merge dev合并  13.查看当前所有分支可以使用:git branch -a    14.git remote add origin    15.git push -u origin master    16.当我们远程有仓库时,想要关联到本地只需要使用git clone就可以了   git clone -b分支名 仓库地址来指定分支  git clone -b main   17.本地提交远程  git add  git commit -m  git push origin master    18.git branch -m 分支名 新的分支名  19.git stash命令来保存当前工作状态,保存完毕才能切换分支   20.git remote origin branch查看远程仓库信息  21.git fetch拉取远程分支   22.git switch dev切换分支  23. git store将文件从暂存区删除

2023.2.1

pow(x,y),x的y次方

2023.2.2

左值就是对象定位器,固定的非暂时的,右值理解成缓存的东西,用过就丢掉,是临时的

strcat,追加字符串,strcat(arr1,arr2);将数组arr2的内容追加道数组1

6 / 100.0   是除法,如果输出%d就是取整,如果是输出%7.2f就是全部结果显示出来

共享内存,内核空间开辟空间,映射道用户空间,不同进程操作用户空间的这个来操作共享内存

2023.2.3 until循环

top命令经常用来监控linux的系统状况,是常用的性能分析工具

管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。有名管道叫named pipe或者FIFO(先进先出),可以用函数mkfifo()创建。

管道有读写锁,相同的就加锁,相反就阻塞

无名管道是血缘之间,有名管道是无血缘

消息队列是随内核持续的,只有在内核重启,或者删除一个消息队列时,该消息队列才会真正地被删除。

strncmp字符串比较 可以比较N个长度的字符串

信号由内核发送给用户空间,只有内核可以发送,

  • 当一个信号到达后,调用处理函数,如果这时候有其他的信号发生,会中断之前的处理函数,等新的信号处理函数执行完毕后在继续执行之前的处理函数
  •   如果是同一个信号的话会排队阻塞

每一个线程都是当前进程里面的一个执行流

until循环:重复测试某个条件,只要条件不成立则反复循环

sprintf(buffer, "thread %d", i)  ,把thread %d 打印到buffer

2023.2.6

find是根据文件名进行查找,grep是对文件的内容进行搜索

int无论32位还是64位,sizeof求解大小都是4. 指针在32位下是4,64位下是8

-:普通文件,d:目录文件,l:链接文件,b:设备文件,c:字符设备文件,p:管道文件

echo “想要的内容”> 文件名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值