c
sunshine008
这个作者很懒,什么都没留下…
展开
-
进程出core相关
可以导致出core的信号不产生core文件的条件:在下列条件下不产生core文件:( a )进程是设置-用户-ID,而且当前用户并非程序文件的所有者;( b )进程是设置-组-ID,而且当前用户并非该程序文件的组所有者;a,b可以通过设置/proc/sys/kernel/suid_dumpable来改变,这样suid的也可以产生core文件( c )用户没有写当前工作目录的许可权;( d )文件太大。core文件的许可权(假定该文件在此之前并不存在)通常是用户读/写,组读和其他读。利用GD原创 2021-02-06 11:00:39 · 650 阅读 · 0 评论 -
linux服务service的使用(包含看门狗)
1、添加服务:/usr/lib/systemd/system/下添加xxx.service,内容如下:[Unit]:服务的说明Description:描述服务After:描述服务类别 [Service]服务运行参数的设置Type=forking 是后台运行的形式ExecStart 为服务的具体运行命令ExecReload 为服务的重启命令ExecStop 为服务的停止命令Restart 为服务的重启命令PrivateT原创 2020-10-26 19:40:05 · 1553 阅读 · 0 评论 -
SIGKILL与SIGTERM的区别
SIGTERM SIGKILL的区别前者可以被阻塞、处理和忽略,但是后者不可以。KILL命令的默认不带参数发送的信号就是SIGTERM.让程序有好的退出。因为它可以被阻塞,所以有的进程不能被结束时,用kill发送后者信号,即可。即:kill -9 进程号。BLOCKED如果进程设置了SIGTERM可以被block,则进程处于block状态时无法被SIGTERM信号杀死。 sigset_t blockSet, savedSigMask; sigemptyset(&blockSe原创 2021-01-16 19:01:24 · 2618 阅读 · 0 评论 -
fork之子进程随父进程死亡prctl
利用prctl的PR_SET_PDEATHSIG属性设置父进程死亡时,发送给子进程的信号。int pid;pid = fork()if (pid == 0) {//子进程//设置父进程死亡时自动给子进程发的信号prctl(PR_SET_PDEATHSIG, SIGKILL)....} else {//父进程}相关属性如下:PR_SET_PDEATHSIG (since Linux 2.1.57) Set the parent death sign原创 2021-01-16 18:49:52 · 1891 阅读 · 0 评论 -
杀死进程组内所有进程
进程组概念 在 linux 中,进程不但有自己的 id 号,还会有一个组 id 号。我们把拥有相同组 id 号的进程的集合称为一个进程组。发送信号给进程和进程组使用 kill -n -pgid 可以将信号 n 发送到进程组 pgid 中的所有进程。例如命令 kill -9 -4115 表示杀死进程组 4115 中的所有进程使用kill -n pid 可以将信号n发送到指定pid进程。进程组的生命周期从进程组被创建开始,到组内所有进程终止或者离开。进程组组长进程组组长是进程组中原创 2021-01-15 20:07:07 · 1399 阅读 · 0 评论 -
替换glibc中malloc、free的几种方法
方案1 使用环境变量LD_PRELOAD方案2 malloc调试变量方案3 编译自己的libmalloc.a方案4 链接过程控制参考链接:https://blog.csdn.net/littlefang/article/details/6052563https://blog.csdn.net/littlefang/article/details/50381587?depth_1-...原创 2020-11-30 09:29:25 · 592 阅读 · 0 评论 -
exec系列函数(execl,execlp,execle,execv,execvp)使用
一、exec替换进程映像在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进程替换掉。例如:在shell命令行执行ps命令,实际上是shell进程调用fork复制一个新的子进程,在利用exec系统调用将新产生的子进程完全替换成ps进程。二、exec系列函数(execl、execlp、execle、e转载 2020-11-21 11:33:36 · 1788 阅读 · 0 评论 -
线程变量__thread使用
#define MAX_CALLBACK_TYPE 100static struct { char stu_type; int flags; void *callback;} msg_callback[MAX_CALLBACK_TYPE] ;如上结构体初始化:#define MAX_CALLBACK_TYPE 100static struct { char stu_type; int flags; void *callback;} msg_callback[MAX_CALLBACK原创 2020-11-16 20:02:43 · 493 阅读 · 0 评论 -
centos8环境pidof获取准确进程pid
基本思路:获取进程所有pid,然后根据当前pid对应的进程文件系统中status文件获取到进程名,与当前进程名完全匹配的即为当前进程的pid。app_name="test"real_pid=-1for pid in `pidof $app_name`; do process_name = `cat /proc/${pid}/status/|grep "Name"|awk '{print $2}'` if [ $process_name == $app_name ]; then real_pi原创 2020-08-18 10:19:43 · 951 阅读 · 0 评论 -
TCMalloc:线程缓存的Malloc
动机TCMalloc要比glibc 2.3的malloc(可以从一个叫作ptmalloc2的独立库获得)和其他我测试过的malloc都快。ptmalloc在一台2.8GHz的P4机器上(对于小对象)执行一次malloc及free大约需要300纳秒。而TCMalloc的版本同样的操作大约只需要50纳秒。malloc版本的速度是至关重要的,因为如果malloc不够快,应用程序的作者就很有可能在malloc之上写一个自己的自由列表。这就可能导致额外的代码复杂度,以及更多的内存占用――除非作者本身非常仔细地划分自翻译 2020-06-23 15:01:49 · 390 阅读 · 0 评论 -
Linux内存布局
我们先来看下Linux内存布局,此图比我之前写的那篇文章写的布局更详细在linux中,每一个进程都被抽象为task_struct结构体,称为进程描述符,存储着进程各方面的信息;例如打开的文件,信号以及内存等等;然后task_struct的一个属性mm_struct管理着进程的所有虚拟内存,称为内存描述符。在mm_struct结构体中,存储着进程各个内存段的开始以及结尾,如上图所示;这个进程使用的物理内存,即常驻内存RSS页数,这个内存使用的虚拟地址空间VSZ页数,还有这个进程虚拟内存区域集合和页表。转载 2020-06-05 20:20:11 · 292 阅读 · 0 评论 -
tcmalloc编译使用
一、编译https://github.com/gperftools/gperftools/releases如上链接页面下载需要版本的代码;cd /home/code/;tar -zxvf gperftools-2.7.90.tar.gz;cd gperftools-2.7.90;../configure --prefix=/usr/local/lib --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --d原创 2020-05-15 18:46:49 · 3429 阅读 · 1 评论 -
gdb报错(A program is being debugged already)
用 gdb attach pid 的方式将gdb挂到一个正在运行的进程上,有时会提示A program is being debugged already. Kill it? (y or n)可能是由于正在执行的进程对应的binary被替换了造成的。如果被替换过的binary和先前的差别不大,并且要调试的部分没有变化,可以用下面的方式做gdb attach:gdb 或者可以将先前被替换...原创 2020-05-06 17:22:02 · 1232 阅读 · 0 评论 -
linux malloc内存申请相关参数设置
情况一、malloc小于128k的内存malloc小于128k的内存时使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后虚拟地址空间建立映射关系),如下图:1、进程启动的时候,其(虚拟)内存空间的初始布局如图1所示。其中,mmap内存映射文件是在堆和栈的中间(例如libc-2.2...翻译 2020-04-23 21:58:35 · 3641 阅读 · 0 评论 -
__typeof__(type)的用法(gcc扩展)
__typeof__(struct s *) xxx;等同于: struct s * xxx;下面的例子可以证明:#include <stdio.h>#include <stdlib.h>struct s { int x; int y; int z;};int main(void){ __typeof__...转载 2020-03-16 19:26:52 · 2046 阅读 · 0 评论 -
C语言基础知识
同等bit长度情况下比较无符号数强转为有符号数:有符号数转换为无符号数1)最高位符号位为0符号位为0的情况下,有符号数直接等于无符号数;2)最高位符号位为1符号位为1的情况下,有符号数转换为无符号数为取有符号数的补码(即最高位符号位不变,非符号位取反,最后整体加1)如 char a = -7 ; 将a强转为无符号char类型即为:1000 0111 —> 1111 1001...原创 2020-02-28 15:31:27 · 340 阅读 · 0 评论 -
局部标签(gcc对c的扩展)
局部标签定义一个局部标签的申明如下: __label__ label;或者:__label__ label1, label2, ...;使用局部标签每个语句内嵌表达式都是一个可以声明局部跳转标签的域。一个局部标签只是一个标识符:你可以使用通常的goto语句跳到它--但是只能在它所属的域内这么做。局部标签的申明必须在语句内嵌表达式的开始出,紧跟({后面,在所有通常申明的左边。局部...转载 2020-02-28 09:54:44 · 524 阅读 · 0 评论 -
内核参数说明
添加链接描述转载 2019-03-06 15:41:44 · 597 阅读 · 0 评论 -
__attribute__(constructor)和__attribute__(destructor)
1、前言最近看代码,看到一个函数前面用__attribute__((constructor))修饰,搜了整个程序,没发现哪个地方调用这个函数。如下:__attribute__((constructor)) void load_file(){ printf("Constructor is called.\n"); g_count = (int *)malloc(sizeof(i...原创 2019-03-06 11:51:52 · 7772 阅读 · 1 评论 -
获取下命令源码包
以ping命令为例1、shell下执行which ping输出: /bin/ping2、dpkg -S /bin/ping输出:iputils-ping: /bin/ping3、apt-get source iputils-ping即可看到当前目录下存在:iputils_20121221-4ubuntu1.1.debian.tar.gz...原创 2018-11-22 20:22:09 · 274 阅读 · 0 评论 -
解决重复包含一个头文件时变量重复定义的问题
#include文件的一个不利之处在于一个头文件可能会被多次包含,为了说明这种错误,考虑下面的代码:#include "x.h"#include "x.h"显然,这里文件x.h被包含了两次,没有人会故意编写这样的代码。但是下面的代码:#include "a.h"#include "b.h"看上去没什么问题。如果a.h和b.h都包含了一个头文件x.h。那么x.h在转载 2016-03-28 16:03:32 · 3752 阅读 · 0 评论 -
结构体作为参数传入函数错误
结构体作为参数传递的错误!如下代码:定义了一个结构体变量,将该结构体变量作为参数传递给函数func2,此时传递给函数func2的是结构体变量my_sis的拷贝,函数func2中对所传入的结构体的修改不影响main函数中定义的结构体,所修改的只是传入的拷贝的副本。 1 #include 2 3 struct score 4 { 5 int math;原创 2016-03-23 19:24:35 · 4754 阅读 · 1 评论 -
原始套接字SOCK_RAW发送UDP数据包
使用原始套接字发送udp数据包,从传输层封包到链路层(mac头+ip头+udp头)。udp数据包,从传输层封包到链路层(mac头+ip头+udp头)。 head.h文件如下: #ifndef _HEAD_H#define _HEAD_H #define BUFFER_MAX 2048#define PCKT_LEN 8492#prag...原创 2016-02-24 20:22:21 · 4428 阅读 · 2 评论 -
使用回溯函数打印函数指针指向的函数名
#include #include void foo(void) { printf("foo\n"); } int main() { void *funptr=&foo; backtrace_symbols_fd(&funptr,1,1); return 0; }如上程序保存为test.c: 编译gc转载 2016-03-09 19:09:33 · 891 阅读 · 0 评论 -
宏替换确定函数被调用位置
函数在头文件中的声明:extern void fun(int a);函数体在c文件中的定义:void fun(int a){printf("a:%d\n",a);}如上所示函数fun,常常被定义在c文件中而被声明在头文件.h中。在使用过程中,包含了头文件即可调用。因此,常会出现不知道该函数是在什么地方被调用了。确定函数的被调用位置可通过如下方式解决:1、在头文件原创 2016-03-01 19:07:24 · 1220 阅读 · 0 评论 -
Linux系统调用列表
Linux系统调用列表以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的。按照惯例,这个列表以man pages第2节,即系统调用节为蓝本。按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了转载 2016-04-01 10:59:39 · 1172 阅读 · 0 评论 -
mac地址分类及如何修改mac地址
IEEE 802定义MAC地址为|||| ccccccug cccccccc cccccccc | xxxxxxxx xxxxxxx xxxxxxxx |由ug控制mac地址类型:u: 0:由 IEEE 指定ID统一管理 1:本地管理g: 0:单播 1:多播也就是12位MAC地址分为四类,由其中第二位决定第二位为 0 | 4 |转载 2016-03-29 17:06:10 · 812 阅读 · 0 评论 -
Apache2 Axis2/C 开发环境搭建(Linux 环境)
系统版本:Ubnuntu 14.04 x86_64GCC版本:gcc version 4.8.4 GMAKE版本:GNU Make 3.811、解压缩 AXIS2/C 安装包 tar -xvf axis2c-src-1.6.0.tar 2、设置环境变量 export AXIS2C_HOME=‘your path to installation’ //看清楚了原创 2016-03-01 16:16:25 · 2221 阅读 · 0 评论 -
网络编程相关结构体整理
常用的套接字类型有3种: (1)流套接字(SOCK——STREAM):使用了面向连接的可靠的数据通信方式,即TCP协议; (2)数据报套接字(Raw Sockets):使用了不面向连接的数据传输方式,即UDP; (3)原始套接字(SOCK——RAW):没有经过处理的IP数据包,可以根据自己程序的要求进行封装。1、套接字相关的数据类型:sockaddr和sockaddr_in;soc原创 2016-04-13 17:49:57 · 717 阅读 · 0 评论 -
网络相关校验和计算(通用)
校验和计算方法如下(先求和再取反):1、将校验和字段置0;2、将要校验的数据以每16bit为一组的形式相加;3、将上述加法过程中产生的进位(最高位的进位)加到低16位(采用32位加法时,即为将高16位与低16位相加,之后还要把该次加法最高位产生的进位加到低16位)4、将上述的和取反,即得到校验和。2.6内核给出的算法:unsigned short ip_fast_csu原创 2016-04-27 18:23:58 · 724 阅读 · 0 评论 -
sourcesight快捷键
快速打开文件:ctrl + o;快速打开symbol:F7;复制一行:ctrl + k;复制本行当前光标右边内容:ctrl + shift + k;设置各功能快捷键:options—>key assignments...原创 2018-11-23 18:48:24 · 406 阅读 · 0 评论 -
基于ubuntu14.04搭建pppoe server
1、安装ppp、pppoe、pppoeconf、rp-pppoesudo apt-get update;sudo apt-get install ppp;sudo apt-get install pppoe;sudo apt-get install pppoeconf;rp-pppoe需要源码编码安装:下载rp-pppoe-3.11.tar.gz http://repository...原创 2018-11-21 17:14:07 · 1786 阅读 · 0 评论 -
Linux下用GDB多线程调试
调试多线程的相关指令显示所有进程info threads这条指令显示可以调试的所有线程,gdb会为每个线程分配一个ID,这个ID和线程ID不同,ID号一般从1开始。切换线程指令为什么要切换线程呢?因为gdb默认在调试多线程程序时只跟踪主线程,而新创建的线程都阻塞在线程创建函数pthread_create处。如果我们不切换,那么我们就无法调试我们在主线程中所创建的线程。 thread ...转载 2018-10-24 09:52:51 · 842 阅读 · 0 评论 -
#if xxx #endif条件注释的使用
' #if defined(X) print ("hello word!\n")' #endif以上编译只与编译宏X有关,与宏定义X的条件是否成立无关。如果定义了X宏,条件即成立,下面print语句会被编译;如果宏X未定义,则print语句不会备编译。‘#ifdef的使用` ’#ifdef的使用和#if defined()的用法一致 ‘#ifndef又和#if !defin...原创 2018-05-07 16:47:45 · 13449 阅读 · 0 评论 -
Linux下/proc目录简介
1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时...转载 2018-05-09 19:03:01 · 579 阅读 · 0 评论 -
路由、邻居增删改查、接口配置、邻居配置命令
路由相关: add 增加路由 del 删除路由 -net 设置到某个网段的路由 -host 设置到某台主机的路由 gw 出口网关 IP地址 dev 出口网关 物理设备名via 网关出口 IP地址 dev 网关出口 物理设备名配置默认路由: route add default gw 192.168.0原创 2016-08-09 16:11:23 · 4212 阅读 · 0 评论 -
gdb attach使用
ps命令查看进程id。 执行gdb attach pid即可调试正在运行的程序。 待补充。原创 2017-03-09 14:55:59 · 20343 阅读 · 0 评论 -
Linux系统编程——I/O多路复用select、poll、epoll的区别使用(转)
I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用。select(),poll(),epoll()都是I/O多路复用的机制。I/O多路复用通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪,就是这个文件描述符进行读写操作之前),能够通知程序进行相应的读写操作。但select(),poll(),epol转载 2016-08-25 17:59:03 · 900 阅读 · 0 评论 -
ubuntu下默认的头文件搜索路径
gcc寻找头文件的路径(按照1->2->3的顺序)1. 在gcc编译源文件的时候,通过参数-I指定头文件的搜索路径,如果指定路径有多个路径时,则按照指定路径的顺序搜索头文件。命令形式如:“gcc -I /path/where/theheadfile/in sourcefile.c“,这里源文件的路径可以是绝对路径,也可以是相对路径。eg:设当前路径为/root/test,inclu翻译 2016-01-02 20:00:18 · 26572 阅读 · 0 评论