linux系统编程
# linux系统编程
lucky tiger
要一直前进,一直静下心来学习。
展开
-
win下使用gvim编译C/C++
1、我资源里有安装包下载gvim一路默认安装2、修改编辑器样式set nocompatiblesource $VIMRUNTIME/vimrc_example.vim"source $VIMRUNTIME/mswin.vim"behave mswin set diffexpr=MyDiff()function MyDiff() let opt = '-a --binary ' if &diffopt =~ 'icase' | let opt = opt . '-原创 2020-11-27 14:29:25 · 1120 阅读 · 0 评论 -
pthread的pthread_join()函数
pthread_join()阻塞等待函数pthread_t tid;pthread_create(&tid, NULL, thread_run,NULL);pthread_join(tid,NULL);#include "stdafx.h"#include <pthread.h>#include <stdio.h>#include <Windows.h>#pragma comment(lib, "pthreadVC2.lib").原创 2020-08-12 16:21:22 · 446 阅读 · 0 评论 -
SHELL脚本一
1、#!/bin/shecho "hello lv"your_name="xiaocao"//等号左右不可以有空格echo $your_nameecho ${your_name}2、已定义变量可以重新定义#!/bin/shecho "hello lv"your_name="xiaocao"echo $your_nameyour_name="xiaoxiao"echo ${your_name}3、readonly your_name设置只读#!/bin/shech原创 2020-08-05 16:05:13 · 84 阅读 · 0 评论 -
GDB小技巧disas /m main以及disas /s main(后面这个更好用将源程序和汇编指令映射起来)
1、#include <stdio.h>void strcats(char *s, char *t);int main(){ char s1[] = "Hello, "; char t1[] = "world!"; strcats(s1, t1); return 0;}void strcats(char *s, char *t){ while (*s) s++; while (*s++ = *t++);}g原创 2020-07-22 20:29:45 · 2839 阅读 · 2 评论 -
好玩的进度条
1、'\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖; '\n' 换行,换到当前位置的下一行,而不会回到行首;https://blog.csdn.net/qq_36221862/article/details/74380126#!/bin/bashindex=0i=0bar=''label=('|' '\\' '-' '/')while [ $i -le 100 ]do let index=i%4 let c...原创 2020-07-16 20:46:52 · 229 阅读 · 0 评论 -
操作系统---------------线程之间共享的资源有哪些
同一进程间共享的资源有:a. 堆 由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的c. 静态变量 虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的。(全局区静态区是一个地方)d. 文件等公用资源 这个是共享的,使用这些公共资源的线程必须同步。W..原创 2020-07-15 16:46:23 · 503 阅读 · 0 评论 -
守护进程
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>int ngx_deamon(){ switch(fork()){ // fork子进程 case -1: // 说明子进程创建失败 写一些日志文件.原创 2020-06-21 20:50:18 · 128 阅读 · 0 评论 -
linux系统编程--------------------------------dup dup2
1、#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>int ngx_deamon(){ switch(fork()){ // fork子进程 case -1: // 说明子进程创建失败 写.原创 2020-06-21 20:17:42 · 153 阅读 · 0 评论 -
linux------------------------进程线程wait、waitpid
1、wait原理(1)子进程结束时,系统向其父进程发送SIGCHILD信号;(2)父进程调用wait函数后阻塞;(3)父进程被SIGCHILD信号唤醒,然后去回收僵尸子进程;(4)父子进程之间是异步的,SIGCHILD信号机制就是为了解决父子进程之间的异步通信问题,让父进程可以及时的去回收僵尸子进程。(5)若父进程没有任何子进程则wait返回错误。2、NAME wait, waitpid, waitid - wait for process to change stat原创 2020-06-21 19:05:47 · 203 阅读 · 0 评论 -
linux------------------------------------僵尸进程
1、僵尸进程一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程2、成为僵尸进程的因素子进程先于父进程退出;子进程的状态信息,没有被父进程回收;3、子进程退出了,父进程怎么知道呢?对该机制有稍微了解的话,不难得知一个关键因素:SIGCHLD。正是这个SIGCHLD起到了通知的作用,所以后面的处理也是基于它而实现。...原创 2020-06-21 17:17:31 · 99 阅读 · 0 评论 -
lseek实现文件读取
原创 2020-03-13 16:38:45 · 414 阅读 · 0 评论 -
Linux三个命令:ps,grep,tail
1、ps命令用来显示当前的进程。是Process Status的缩写。如果需要动态的显示进程,可以使用top命令。ps常用参数-A,-e:列出所有的进程;aux:列出所有使用者的详细进程(最常用);u:指定用户的进程;r:列出正在运行的程序;T:当前终端的所有进程。上图中的各列分别代表:USER:进程拥有者;PID:进程的ID;%CPU:CPU占用率;%MEM:内存占用率;VSE:该进程使用掉的虚拟内存量 (Kbytes);RSS:该进程占用的固定的内存量 (Kbyt.原创 2020-06-15 20:56:55 · 1139 阅读 · 0 评论 -
linux------------------------------------read、write
write()头文件:#include<unistd.h>原型:ssize_t write(int fd,const void*buf,size_t count);参数说明: fd:是文件描述符(write所对应的是写,即就是1) buf:通常是一个字符串,需要写入的字符串 count:是每次写入的字节数返回值:成功:返回写入的字节数失败:返回-1并设置errno ps: 写常规文件时,write的返回值通常等于请求写的字节 数count...原创 2020-06-15 20:15:58 · 135 阅读 · 0 评论 -
linux------------------------------------open函数
1、#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int open( const char * pathname, int flags);int open( const char * pathname,int flags, mode_t mode);函数说明参数pathname 指向欲打开的文件路径字符串。下列是参数flags 所能使用的旗标:O_RDONLY 以只读方式打原创 2020-06-15 20:08:03 · 131 阅读 · 0 评论 -
进程间通信(IPC)之-----------fifo
1、无名管道,由于没有名字,只能用于亲缘关系的进程间通信多。为了克服这个缺点,提出了命名管道(FIFO),也叫有名管道、FIFO 文件。命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相关的进程也能交换数据。命名管道(FIFO)和无名管道(pipe)有一些特点是相同的,不一样的地方在于:#in原创 2020-06-15 20:04:37 · 247 阅读 · 0 评论 -
文件描述符
1、2、为什么程序的输入输出要用文件描述符来表示呢,他明明不是文件啊?linux在系统抽象上的创新万物皆文件:一切对二进制流的操作都可以类比为对文件的操作因此只要计算机上所有操作都使用对文件接口进行操作,在一定程度上便可以互联互通...原创 2020-06-14 10:14:04 · 283 阅读 · 0 评论 -
如何在shell里面使用管道 | (小tip)
1、2、管道把上一句的输出当作输入 head -c -3输出前3个3、wc word count缩写计算输入内容字符数原创 2020-06-14 09:43:55 · 407 阅读 · 1 评论 -
进程间通信(IPC)之-----------mmap
1、2、#include <stdio.h>#include <sys/mman.h>#include <stdlib.h>#include <string.h>#include <fcntl.h>#include <unistd.h>#include <fcntl.h>int main(void){ int fd = open("testmap", O_RDWR | O_TRUNC | O原创 2020-06-13 21:19:05 · 859 阅读 · 0 评论 -
lseek 使用
#include <sys/types.h>#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);fd 表示要操作的文件描述符offset是相对于whence(基准)的偏移量whence 可以是SEEK_SET(文件指针开始),SEEK_CUR(文件指针当前位置) ,SEEK_E...原创 2019-07-23 22:43:59 · 251 阅读 · 0 评论 -
进程间通信(IPC)之-----------文件
1、linux 环境中进程地址空间相互独立,每个进程各自有不同的用户地址空间任何一个进程的全局变量在另一个进程都是不可见的,进程与进程之间不可以相互访问,所以需要内核来进行数据交换。在内核中开辟数据缓存区,进程1把数据从用户空间拷贝到内核缓存区,进程2再从内核缓存区把数据取走比方说我有两个进程 a.out b.out我如果在A中打开一个文件我可以通过文件描述符来操作A B中文件描述符是可以不相等的这取决于当前进程中文件描述符的使用情况 0 1 2错误输入输出这几个是一般...原创 2020-06-13 20:25:05 · 401 阅读 · 0 评论 -
死锁
1、第一次锁 mutex 02、3、原创 2020-06-13 16:27:39 · 167 阅读 · 0 评论 -
原子操作
1、2、加了锁以后我可能还是会失去CPU但是其他线程无法访问我的东西CPU回来以后我再继续执行原创 2020-06-13 16:18:06 · 147 阅读 · 0 评论 -
进程线程PTHREAD之互斥锁(三)
1、#include <pthread.h>int pthread_mutex_destroy(pthread_mutex_t *mutex);int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int pthread_mutex_loc原创 2020-06-13 15:33:39 · 505 阅读 · 0 评论 -
进程线程PTHREAD之线程同步(二)
1、如何解决线程同步:协同步调,按照先后顺序执行操作我给共享资源加一把锁原创 2020-06-13 14:48:25 · 164 阅读 · 0 评论 -
进程线程PTHREAD之数据混乱(一)
1、数数是CPU来数数,存到寄存器里面,CPU能数的数据量比较小寄存器需要和物理内存实时做数据交换取数据的值时在物理内存中取值#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include<pthread.h>#define MAX 10000int number;void* funcA_num(void* arg){ for(int i =原创 2020-06-12 21:59:06 · 206 阅读 · 0 评论 -
linux下进程间通信的几种主要手段:
linux下进程间通信的几种主要手段: 1.管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 2.信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期 信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction...转载 2020-06-12 21:21:02 · 236 阅读 · 0 评论 -
最基本的makefile三(一些特殊符号的使用)
1、用一个其他东西代替gcc<cc = gcc>或许你有时候会有许多gcc要改g++会很麻烦用这种类似与全局变量的东西会很简单CC = gccmain:main.c tool.o bar.o $(CC) main.c tool.o bar.o -o maintool.o:tool.c $(CC) -c tool.cbar.o:bar.c $(CC) -c bar.cclean: rm main rm *.o2、需要另外一些编译条件时CC = gccFLAG原创 2020-06-04 15:19:36 · 364 阅读 · 0 评论 -
最基本的makefile三(多个文件一起)
1、在二的基础上再添加一个函数bar.c#include"bar.h"int find_min(int arr[], int n){ int i; int m = arr[0]; for(i=0; i<n; i++) { if(arr[i] < m) { m = arr[i]; } } return m;}2、bar.hint find_min(int arr[], int n);3、makefilemain:ma.原创 2020-06-04 15:06:52 · 210 阅读 · 0 评论 -
最基本的makefile二(多个文件综合在一起的用法)
1、新建tool.c注意这里是自己写的头文件引用的时候要用双引号#include"tool.h"#include"tool.h"int find_max(int arr[], int n){ int i; int m = arr[0]; for(i=0; i<n; i++) { if(arr[i] > m) { m = arr[i]; } } return m;}2、新建tool.h#ifndef _TOOL_H#define.原创 2020-06-04 14:55:33 · 543 阅读 · 0 评论 -
最基本的makefile一
1、target:依赖TAB规则命令2、改进升级中间产物后面还可以加一个rm make cleanrm -f可以看不到输出消息原创 2020-06-04 11:23:10 · 168 阅读 · 0 评论 -
PS -e -f
ps 是LINUX下最常用的也是非常强大的进程查看命令ps -e 显示所有进程。-f 全格式。举栗子:ps e 列出程序时,显示每个程序所使用的环境变量。 ps f 用ASCII字符显示树状结构,表达程序间的相互关系 查看某进程是否存在 ps -ef | grep nginx root 3675 3437 0 00:38 pts/0 00:00:00 grep --color=auto nginx 当然,加上f会看到很多信息,会比较乱,有时候也可...原创 2020-05-29 15:42:17 · 1758 阅读 · 0 评论 -
linux-sigaction 捕捉setitimer产生信号
1、#include <stdio.h>#include <signal.h>#include <unistd.h>#include <sys/time.h>void catch_sig(int num){ printf("catch %d sig\n",num);}int main(){struct sigaction ...原创 2020-04-23 15:08:55 · 257 阅读 · 0 评论 -
linux-环境变量进程线程
程序、编译好的二进制文件进程、运行着的程序(程序员:一系列运行的指令的过程)(操作系统:分配系统资源的基本单位)1、ulimit -a查看所有资源上限2、环境变量:key=val;=左右不可以有空格PATH:可执行文件的搜索路径3、man getenv#include <stdio.h>#include <stdlib.h&...原创 2020-03-31 15:47:56 · 368 阅读 · 0 评论 -
linux-cat命令的实现
1、read write是最基本最常用的io操作,是应用层和内核层沟通的媒介,如何使用read、write实现cat函数呢?明确一点我们是读取文件然后显示出来也就是输出出来文件描述2实现起来很简单主要是熟悉一下思路流程伪代码思路:#include <stdio.h>int main(int argc,int argv[]){int fd=open(argv[...原创 2020-03-13 15:56:51 · 1750 阅读 · 0 评论 -
linux进程线程-alarm闹钟函数
1、alarm 返回值 距离上一次闹钟出发剩余秒数第一次设置返回0,第二次设置了返回距离上一个闹钟的剩余的秒数。[1] 引用头文件:#include <unistd.h>;[2] 函数标准式:unsigned int alarm(unsigned int seconds);[3] 功能与作用:alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经...原创 2020-04-22 21:38:34 · 815 阅读 · 0 评论 -
linux-进程线程-setitimer
1、SYNOPSIS #include <sys/time.h> int getitimer(int which, struct itimerval *curr_value); int setitimer(int which, const struct itimerval *new_value, ...原创 2020-04-23 14:25:02 · 277 阅读 · 0 评论