![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Unix高级环境编程
zhouzhenhe2008
这个作者很懒,什么都没留下…
展开
-
jsoncpp交叉编译makefile及方法
jsoncpp交叉编译makefile及方法原创 2022-05-31 22:17:40 · 484 阅读 · 0 评论 -
使用epoll模型
epoll模型可以说是select模型和poll模型的升级版,但epoll要求在linux内核版本2.6以上。相对于,select和poll来说,epoll更加灵活,没有描述符限制。相比于select和poll,epoll不会因为监听的描述符数目变多而导致轮询过多(耗时太多),不会因为fd的数目增大而降低响应效率。 另外,对于select的最大描述符,linux会有限制,在linux/原创 2017-07-29 19:46:09 · 429 阅读 · 0 评论 -
Linux stat函数获取文件属性(文件大小,创建时间等,判断普通文件或者目录等)
struct stat64 s;memset(&s, 0, sizeof(struct stat64));nRet = stat64(pchFilename, &s);if (nRet){SK_ERROR(("stat %s failed! error_code: %s", pchFilename, strerror(errno)));return SK_FAILE原创 2017-01-01 19:12:51 · 18230 阅读 · 0 评论 -
字节序大端和小端的理解
根据处理器的不同,字节序分为大端和小端。所谓大端,就是高字节的数据存放在低地址的内存地址,低字节的数据存放在高地址的内存地址。所谓小端,就是高字节的数据存放在高地址的内存地址,低字节的数据存放在低地址的内存地址。 大端如图示例:小端如图示例:如何写一个C语言程序识别目前机器是大端还是小端?#include原创 2017-07-13 20:51:27 · 479 阅读 · 0 评论 -
进程间的消息队列及msgtype的用法
Client.c#include #include #include #include #include #include #include #include #include extern int errno;#define ClientKey 1234static int gs_nClientMsgid = -1; typedef struct st原创 2017-06-06 23:48:38 · 8298 阅读 · 0 评论 -
gdb可以用于分析core文件
gdb可以用于分析core文件。产生core的原因一般是1.内存访问越界,错误的数组下标,字符串越界,2。多线程下使用线程不安全的函数3.多线程共享数据不加锁保护。4.非法指针。5堆栈溢出。特别是不能使用过大的局部变量,容易早成栈溢出。root@ubuntu:~# ulimit -c0 可以查看原创 2017-04-14 19:02:15 · 2461 阅读 · 0 评论 -
linux opendir和readdir的使用
1 opendir#include #include DIR *opendir(const char *name);传入name路径,成功则返回非空DIR指针,否则返回NULL2 readdir #include struct dirent *readdir(DIR *dirp);原创 2017-06-11 22:58:11 · 11086 阅读 · 0 评论 -
memmove的用法及实现
-bash-3.2$ man memmoveMEMMOVE(3) Linux Programmer’s Manual MEMMOVE(3)NAME memmove - copy memory areaSYNOPSIS #include void *me原创 2017-07-06 19:44:51 · 13136 阅读 · 4 评论 -
linux gettimeofday的用法
SYNOPSIS #include int gettimeofday(struct timeval *tv, struct timezone *tz); struct timeval { time_t tv_sec; /* seconds 秒 */ suseconds_t tv_usec;原创 2017-06-10 13:51:20 · 1986 阅读 · 0 评论 -
Linux时间操作(time、gettimeofday)
一、time函数 #include time.h>time_t time(time_t *calptr);返回距计算机元年的秒数一旦取得这种以秒计的很大的时间值后,通常要调用另一个时间函数将其变换为人们可读的时间和日期#include //calendar time into a broken-down time expressed as UTC转载 2014-10-22 07:39:37 · 1078 阅读 · 0 评论 -
linux上获取北京时间的一个方法(2017.1.5更新)
#include #include #include #define ERROR -1 #define MyOK 1int main(){ time_t time_out; time_t time_in; struct tm *tm_now = NULL ; memset(&time_out, 0, sizeof(time_out));原创 2014-10-22 22:39:14 · 3219 阅读 · 2 评论 -
Linux系统调用—时间和日期
asctime(将时间和日期以字符串格式表示)相关函数time,ctime,gmtime,localtime表头文件#include定义函数char * asctime(const struct tm * timeptr);函数说明asctime()将参数timeptr所指的tm结构中的信息转载 2014-10-22 07:49:09 · 1496 阅读 · 0 评论 -
根据/proc/partitions获取插入的U盘设备名称
1 在/proc/partitions中存放着U盘的设备名称,如sda,sdb2等,以sd开头。major 主设备号,比如一个U盘有3个分区,主设备名为sda,major为8,分区的major也为8,minor则为分区号,sda1,sda2,minor值为1 ,2sda的minor为0,name即为设备名,连接/dev./设备名,就可以挂载到一个目录。blocks表示物理设备逻辑块原创 2017-06-08 23:40:47 · 5314 阅读 · 0 评论 -
利用/proc/mounts检查已经被系统挂载的设备
1 介绍/proc/mounts如何利用/proc/mounts知道已经挂载上的设备呢,我们先来看看/proc/mounts都有啥东西解释一下,第一列是设备路径,比如说/dev/sda1 第二列是挂载点(即设备挂载到的目录) 第三列是以什么文件系统挂载2 编代码读取前3列#include #include #include int re原创 2017-06-08 20:38:51 · 21266 阅读 · 3 评论 -
如何利用/proc/filesystems的信息预先知道支持的U盘挂载系统
1 介绍/proc/filesystems/proc/filesystems里存放着本台机器linux系统支持的文件挂载系统,不同的linux系统可能会得到不同的结果。2 简要代码#include #include #include static char chFstypeInfo[][10] = { {"ext3"}, {"ext2原创 2017-06-08 19:58:46 · 3572 阅读 · 0 评论 -
select的使用及缺陷
使用select多路复用模型,可以显著提高服务器的处理能力。select可以指定关心的描述符集以及关心这些描述符事件(可读、可写、异常),愿意等多久。 select函数的原型 /* According to POSIX.1-2001 */ #include /* According to earlier standar原创 2017-07-21 09:00:30 · 4071 阅读 · 0 评论 -
Linux C/C++ 多线程死锁的gdb调试方法
死锁的原因就不多说了,本质上,就是有一些线程在请求锁的时候,永远也请求不到。 先把有死锁的多线程代码贴出来#include #include #include #include #include pthread_mutex_t g_smutex ; void * func(void *arg){ int i=0; //lock pthread_mut原创 2017-07-31 11:14:29 · 8298 阅读 · 0 评论 -
C++ strftime和std::get_time对linux struct tm的作用
代码说明一切。strftime给 struct tm结构体的日期的年+1900,月份+1,并按格式转成字符串std::get_time则对字符串获取struct tm结构体,年份-1900,月份-1代码如下:#include <iostream>#include <stdio.h>#include <time.h>#include &l...原创 2018-10-18 20:39:48 · 2708 阅读 · 0 评论 -
Linux使用带时区转换的时间函数注意事项(负负得正)
linux时间结构体定义:struct tm{ int tm_sec; //代表目前秒数,正常范围为0-59,但允许至61秒 int tm_min; // 代表目前分数,范围0-59 int tm_hour; //从午夜算起的时数,范围为0-23 int tm_mday; //目前月份的日数,范围01-31原创 2018-02-27 22:46:12 · 2690 阅读 · 0 评论 -
linux usleep函数参数溢出(睡眠多少微秒)
usleep函数的参数类型为unsigned inthttps://linux.die.net/man/3/usleep(1)usleep((0xffffff*1000));(2) usleep((0xffffffff));#include #include #include #include #include原创 2016-12-26 13:45:55 · 3862 阅读 · 0 评论 -
C++11实现生产者和消费者
#include #include #include #include #include #include #include class CThreadMsg{private: std::deque m_data; std::mutex m_mtx; // 全局互斥锁. std::condition_variable m_cv; // 全局条件变量. int原创 2017-09-06 14:22:33 · 878 阅读 · 0 评论 -
实现自己的日志函数,非常简单。
log.h#ifndef log_H_#define log_H_#include int logInit();int logPrintTime();#ifndef LOG_TRACE#define LOG_TRACE printf#define LOG_INFO(msg) \ do{ \ logPrintTime();\ LOG_TRACE msg;原创 2017-06-10 16:29:13 · 682 阅读 · 0 评论 -
使用select实现多线程定时器
#include #include #include #include #include #include #include #include int set_timer_s(long u32Time){ struct timeval stuTime; int ret = 0; memset(&stuTime, 0, sizeof(struct原创 2017-08-20 19:21:08 · 3932 阅读 · 0 评论 -
linux运行级别
也许大家偶然会发现/sbin里有个init命令。你知道它是如何使用的吗? 如果你不喜欢使用图形登录方式,如何能够让用户在控制台下运行startx命令呢? 有时你要维护服务器,暂时不希望别的用户登录系统,但自己仍对网络有访问权,又该怎么办呢? 其实,如果你知道了三个问题之间的关系,它们就不成问题了。让我们这里入手了解一下Linux的运行级别(runlevel)吧! 其实ini转载 2017-08-19 20:23:29 · 359 阅读 · 0 评论 -
linux开机启动自动执行某个脚本
有时候我们需要在开机的拉起一个服务或进程。比较方便的改法是在文件/etc/rc.local,编辑这个文件,在末尾添加source 脚本名称.sh脚本run_httpd_server.sh的内容#!/bin/bashexport BASE_DIR=$(pwd)echo ${BASE_DIR}cd /share/http/apache2.2.32-install/原创 2017-08-19 20:18:54 · 28349 阅读 · 0 评论 -
gdb常用命令的使用
最近使用gdb调试嵌入式设备,所以把常用的gdb命令记下。 (1)把先交叉编译gdb,是gdb版本对应嵌入式上的cpu。(该步骤不详解) (2)挂载跑设备 (3)gdb ./a.out (a.out为可执行文件名) (4)一般会先设置断点,断点设置可以函数名或者是文件名+行号 如 br原创 2017-03-15 13:35:05 · 323 阅读 · 0 评论 -
如何给有死锁的进程发送信号,让他产生core文件
当然就是没有死锁也可以发信号让他产生core文件 1 首先来了解信号 Signal Description Signal number on Linux x86[1] SIGABRT Process aborted 6 SIGALRM Signal raised by alarm 14 SIGBUS Bus error: "access to undefined原创 2017-08-01 15:20:47 · 2681 阅读 · 0 评论 -
简单修改core的后缀名及路径
echo "/tmp/core-%e-%p" > /proc/sys/kernel/core_pattern本会话生成的core文件将以 "/tmp/core-程序名-进程号" 的形式生成使进程产生core(另外一个shell会话)root@ubuntu:~# ps -aux| grep a.outroot 16630 47.7 0.1 43320原创 2017-08-01 15:34:14 · 985 阅读 · 0 评论 -
linux poll函数的使用
在网络编程中,Linux的poll函数跟select一样,可以处理多路复用。可以通过设置关注的描述符事件,灵活等待事件的到来。 #include int poll(struct pollfd *fds, nfds_t nfds, int timeout); (1)参数fds是pollfd结构体指针,可以指向一个结构体数组 struc原创 2017-07-22 21:49:49 · 12613 阅读 · 0 评论 -
inet_addr()和htonl()结合使用引发的connect()超时
Tcp通信使用的是网络字节序,所以一般都需要htonl()把ip地址转换成网络字节序,但如果ip已经是网络字节序了,再调用htonl就会导致不再是网络字节序了,引发严重后果,就是connect或者使用了一个相反的ip上代码服务端:#include #include #include #include /* See NOTES */#include #inclu原创 2017-07-19 10:35:37 · 3200 阅读 · 0 评论 -
网络套接字编程基本api
网络层的IP可以惟一标识网络中的主机,而传输层的协议、端口这两个东西可以表示主机中的进程(也就是网络应用程序)。因此,通过IP、协议、端口号,可以标识网络的进程。 先说服务器这边吧(1)服务器根据地址的类型(属于ipv4还是ipv6等)、socket类型(比如TCP、UDP)去创建socket,创建出的套接字socket本质上也是个文件描述符。(2)服务器绑定IP地原创 2017-07-19 08:13:42 · 2690 阅读 · 0 评论 -
Valgrind内存泄漏检查及定位利器
1.安装Ubuntu系统,执行 apt-get install valgrind。 2.命令介绍(1)查看所有命令介绍valgrind --help 拷贝部分说明出来usage: valgrind [options] prog-and-args tool-selection option, with default in [ ]: -原创 2017-06-19 22:24:23 · 813 阅读 · 0 评论 -
使用C语言封装链表函数
list.h#include #include #include #include #ifndef LOG_TRACE#define LOG_TRACE printf#define LOG_INFO(msg) \ do{ \ LOG_TRACE msg; \ LOG_TRACE("[%s %d] \n",__FUNCTION__,__LINE__);\ }whi原创 2017-06-11 17:13:12 · 1229 阅读 · 0 评论 -
进程中的标识符和键(ftok函数创建)(共享内存,消息队列,信号量用到的)
每个内核中的IPC结构(消息队列、信号量和共享内存)都用一个非负整数的标识符(identifier)加以引用。 也就是说,一个非负整数代表一个IPC结构。 比如,为了对一个消息队列发送或者取消息,只需要知道其队列标识符,与文件描述符不同,IPC标识符不是小的正数。当一个IPC结构被创建,以后又被删除,与这种结构相关的标识符连续加1,直到达到整型数的最大正直,然后又回到0。对于同原创 2017-06-06 23:39:50 · 892 阅读 · 0 评论 -
使用strace追踪程序的系统调用
strace命令主要是追踪程序的系统的调用,可执行文件 helloworld由 (makefile基础学习 http://blog.csdn.net/zhouzhenhe2008/article/details/55117592)编译而得主程序如下:#include "hello.h"#include int s= 9;int main(){ hello1_print();原创 2017-04-10 22:10:24 · 3270 阅读 · 0 评论 -
C/C++生成随机数字符串(错误方法和正确方法)
src原创 2017-03-21 14:40:35 · 3387 阅读 · 0 评论 -
使用strip给文件减肥
helloworld减肥前9708个字节helloworld减肥后,5580个字节使用file命令查看已经减肥了使用nm命令已经看不到文件的符号信息原创 2017-03-19 14:24:01 · 561 阅读 · 0 评论 -
使用nm命令获取可执行文件里的符号
linux的nm命令可以获取可执行文件里的符号表。如可执行文件helloworld,执行 nm helloworldroot@ubuntu:/share/learn# root@ubuntu:/share/learn# nm helloworld 0804a024 B __bss_start0804a024 b completed.71810804a018 D原创 2017-03-19 11:45:02 · 8273 阅读 · 1 评论 -
ELF文件
ELF是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储的标准文件格式。1.ELF文件类型ELF的文件类型主要有三种,可重定位的目标文件、可执行的目标文件、可被共享的目标文件。(1)可重定位的目标文件由汇编器生成的.o文件,链接器拿一个或者一些可重定位的目标文件作为输入,经过链接处理后,生成一个可执行的目标文件或者一个可被共享的对象文件.so,可以使用ar原创 2017-03-19 11:24:15 · 582 阅读 · 0 评论 -
linux动态库的创建及使用
动态链接库,即 对库函数放在程序运行时再链接载入。 命名规则: libXXXX.so使用文章《makefile基础学习》中的源文件hello1.c hello2.c hello.h hello_main.c。http://blog.csdn.NET/zhouzhenhe2008/article/details/原创 2017-02-26 13:30:41 · 327 阅读 · 0 评论