
Linux c语言
文章平均质量分 62
小熊@XiaoXiong
这个作者很懒,什么都没留下…
展开
-
linux localtime_r()获取的时间比实际时间差八个小时
在linux下用localtime_r()获取的时间比实际时间差八个小时,这个一般是因为时区设置导致的,我们可以在 /etc/profile 中设置时区设置为CST时区,然后source /etc/profile export TZ='CST-8'关于时区的详解可以参考:https://www.douban.com/note/147740972/...原创 2020-11-19 18:20:41 · 2919 阅读 · 0 评论 -
linux下ntpdate网络对时引发的血案
序言事情是这样的,Mqtt里面用的时间超时是用系统时间戳来计算的,然后在测试的过程中偶然发现Mqtt 在进入yield 的过程中会出不来,就是一直在里面等待,然后我一路往下看代码也没发现有可能阻塞的地方,然后反过来看超时的地方用的是系统时间戳,这块引起了我的注意,果不其然,我用date查看系统时间是2036年,难道穿越了,这时间怎么不对,现在才2020年啊,难道是ntpdate对时的时候出问题了,这也不应该啊,我反复测试ntpdate也没出现问题,然后我发现这个问题只有在系统重启的时候才有可能出现看来是原创 2020-11-19 18:05:42 · 411 阅读 · 0 评论 -
使用libcurl出现的段错误问题解决
1. 问题定位在使用libcurl时出现了段错误,经过调试发现出现的时机是在断网的情况下,为了保持网络的自动恢复我会在程序中重启网络节点 ifconfig eth0 down,如果这时正在用 libcurl 做 GET 请求或者 POST 请求等就会出现段错误2. 分析出现原因libcurl在configure默认配置编译的情况下,它是使用alarm+siglongjmp实现域名解析超时。如果这个时候执行了 ifconfig eth0 downDNS解析会失败,然后 libcrl 会发出信号来打断等原创 2020-08-13 17:16:03 · 2156 阅读 · 0 评论 -
嵌入式linux时间同步,ntpdate的交叉编译
1.交叉编译ntpdate下载:http://www.ntp.org/downloads.html 或者https://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/配置./configure --prefix=$PWD/install --exec-prefix=$PWD/install --host=arm-linux CC=arm-linux-gcc --with-yielding-select=yes配置安装目录和编译器make在make的时候报原创 2020-06-24 13:49:26 · 791 阅读 · 0 评论 -
利用backtrace和backtrace_symbols函数打印调用栈信息
在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈。#include int backtrace(void **buffer, int size); char **backtrace_symbols(void *const *buffer, int size); void backtrace_symbols_fd(void *const *buffer转载 2017-06-27 16:03:12 · 920 阅读 · 0 评论 -
linux新定时器:timefd及相关操作函数
timerfd是Linux为用户程序提供的一个定时器接口。这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景。一,相关操作函数#include int timerfd_create(int clockid, int flags);int timerfd_settime(int fd, int flags, const s转载 2017-06-27 16:04:11 · 400 阅读 · 0 评论 -
gdb用法
mickole@test:~/ctest/05gdb$ gdb simple //开始gdb调试 GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04 Copyright (C) 2012 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or转载 2017-06-27 16:05:08 · 338 阅读 · 0 评论 -
Linux c判断文件是否存在
转自:http://blog.youkuaiyun.com/kingjo002/article/details/8442146一、access函数功能描述: 检查调用进程是否可以对指定的文件执行某种操作。 用法: #include #include int access(const char *pathname, int mode); 参数: pathname:转载 2017-06-27 14:05:56 · 7795 阅读 · 0 评论 -
cJSON 使用
CSJON库基本数据格式 cJSON 定义typedef struct cJSON { struct cJSON *next,*prev; // 数组 对象数据中用到 struct cJSON *child; // 数组 和对象中指向子数组对象或值 int type; // 元素的类型,如是转载 2017-07-07 15:39:15 · 989 阅读 · 0 评论 -
c语言中goto使用注意事项
在c语言中可以用goto来处理错误,但是要特别注意的是goto会顺序执行下去,所以在goto中如果没有分支或retun的话可能会出错#include<stdio.h>//冒泡排序,把数组中的元素从大到小或从小到大列出int main(void){ int arr[10]={8, 1, 6, 7, 5, 0, 3, 2, 4, 9}; int i, j, temp, count =原创 2017-07-08 21:21:56 · 11164 阅读 · 0 评论 -
inotify -- Linux 2.6 内核中的文件系统变化通知机制
一、 引言众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如 hotplug、udev 和 inotify 就是这种需求催生的。Hotplug 是一种内核向用户态应用通报关于热插拔设备一些事件发转载 2017-08-10 16:36:26 · 386 阅读 · 0 评论 -
Linux下串口发送数据一段数据后发送不出去(可以正常接收)
Linux下串口发送数据一段数据后发送不出去(可以正常接收),在PC调试时一切正常,但是连接到别的板子上做数据透传时出现了这样的问题 解决办法:在串口初始化和波特率设置时将options结构体memset为0,但是不清楚真正的原因static int set_speed(int fd, int speed){ int i; int status; struct ter原创 2017-09-14 16:07:22 · 6664 阅读 · 0 评论 -
Linux下c语言实验Websocket通讯 含客户端和服务器测试代码
Websocket是一种可双向通讯的网络协议,其底层的数据收发是基于socket的,所以使用c语言来实现理论上是没有问题的,主要难点在于协议中要求对个别数据进行加密处理,这些加密方法(库)在java、c#等专门开发web的平台中都是自带的API(随调随到),而在用到c语言时则苦于去寻找这些加密方法的源码和库,这使得用c来实现Websocket变得繁琐而吐血!所以非要用c语言来实现Websocket转载 2018-04-30 16:14:27 · 2568 阅读 · 0 评论 -
linux系统编程之管道(三):命令管道(FIFO)
linux系统编程之管道(三):命令管道(FIFO)一,匿名管道PIPE局限性管道的主要局限性正体现在它的特点上:只支持单向数据流;只能用于具有亲缘关系的进程之间;没有名字;管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或转载 2017-06-27 16:02:31 · 366 阅读 · 0 评论 -
linux系统编程之管道(二):管道读写规则
一,管道读写规则当没有数据可读时O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。当管道满的时候O_NONBLOCK disable: write调用阻塞,直到有进程读走数据O_NONBLOCK enable:调用返回-1,errno值为EAG转载 2017-06-27 16:01:34 · 783 阅读 · 0 评论 -
Linux下字符串解析的一些方法
转自:http://blog.chinaunix.net/uid-25808509-id-2930277.html在linux下编程时,有时候我们需要获取shell命令的执行结果,一种比较笨的方法是将shell命令的执行结果保存到文件,然后在读文件,读完之后,再删除文件,或者使用临时文件也行。这种方法比较繁琐,我推荐的一种方法是使用popen函数,FILE *popen(con转载 2017-04-20 11:12:42 · 2172 阅读 · 0 评论 -
c语言指针在传参时的注意事项
1 #include 2 #include 3 4 char *func() 5 { 6 char arr[] = {"123456"}; 7 8 // char *arr = "1234567890"; 9 printf("arrsize = %d\n", sizeof(arr)); 10 return arr原创 2017-05-09 19:29:13 · 408 阅读 · 0 评论 -
linux mktime函数用法
用到的结构体在使用mktime时会默认忽略这连个值int tm_wday; /* day of the week */int tm_yday; /* day in the year */struct tm ;#include 1 struct tm { 2 i原创 2017-07-11 13:20:35 · 2833 阅读 · 0 评论 -
守护进程详解及创建,daemon()使用
一,守护进程概述Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器m转载 2017-06-27 15:39:54 · 360 阅读 · 0 评论 -
linux系统编程之信号(一):中断与信号
一,什么是中断?1.中断的基本概念中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。引起中断发生的事件被称为中断源。中断源向CPU发出的请求中断处理信号称为中断请求,而CPU收到中断请求后转到相应的事件处理程序称为中断响应。转载 2017-06-27 15:48:57 · 6284 阅读 · 0 评论 -
linux系统编程之信号(二):信号处理流程(产生、注册、注销、执行)
对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个阶段:信号诞生信号在进程中注册信号在进程中的注销信号处理函数执行1 信号诞生 信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包转载 2017-06-27 15:51:41 · 810 阅读 · 0 评论 -
linux系统编程之信号(三):信号安装、signal、kill,arise讲解
一,信号安装如果进程要处理某一信号,那么就要在进程中安装该信号。安装信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个信号;该信号被传递给进程时,将执行何种操作。linux主要有两个函数实现信号的安装:signal()、sigaction()。其中signal()只有两个参数,不支持信号传递信息,主要是用于前32种非实时信号的安装;而sigaction()是较转载 2017-06-27 15:53:24 · 723 阅读 · 0 评论 -
linux系统编程之信号(四):alarm和可重入函数
一,alarm()在将可重入函数之前我们先来了解下alarm()函数使用:#include unsigned int alarm(unsigned int seconds)系统调用alarm安排内核为调用进程在指定的seconds秒后发出一个SIGALRM的信号。如果指定的参数seconds为0,则不再发送 SIGALRM信号。后一次设定将取消前一次的设定。该调用返回值为上次定时调转载 2017-06-27 15:54:09 · 327 阅读 · 0 评论 -
linux系统编程之信号(五):信号集操作函数,信号阻塞与未决
一,信号集及相关操作函数信号集被定义为一种数据类型:typedef struct { unsigned long sig[_NSIG_WORDS];} sigset_t信号集用来描述信号的集合,每个信号占用一位(64位)。Linux所支持的所有信号可以全部或部分的出现在信号集中,主要与信号阻塞相关函数配合使用。下面是为信号集操作定义的转载 2017-06-27 15:54:47 · 220 阅读 · 0 评论 -
linux系统编程之信号(六):信号发送函数sigqueue和信号安装函数sigaction
一,sigaction()#include int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact));sigaction函数用于改变进程接收到特定信号后的行为。该函数的第一个参数为信号的值,可以为除SIGKILL及SIGSTOP外的任何一个特定有效的信号(为这两个信号定义自己的处理函转载 2017-06-27 15:55:58 · 306 阅读 · 0 评论 -
linux系统编程之信号(八):三种时间结构及定时器setitimer()详解
一,三种时间结构time_t://seconds struct timeval {long tv_sec; /* seconds */long tv_usec; /* microseconds */}; struct timespec {time_t tv_sec; /* seconds */long tv_nsec; /* nanoseconds */转载 2017-06-27 15:57:46 · 3099 阅读 · 0 评论 -
linux系统编程之管道(一):匿名管道(pipe)
一,什么是管道管道是Linux支持的最初Unix IPC形式之一,具有以下特点:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。数据的读转载 2017-06-27 16:00:46 · 303 阅读 · 0 评论 -
10进制,16进制的atoi
#include #include int my_atoi(char * str){//用于录入16进制的MAC地址int value = 0;int sign = 1;int radix = 16;if(*str == '-'){sign = -1;str++;}// if(*str == ' ')//空格不录入// ret原创 2017-04-20 09:47:04 · 3778 阅读 · 0 评论