- 博客(17)
- 资源 (1)
- 收藏
- 关注
原创 移植freetds连接sql server教程
移植freetds连接sql server教程一、 freetds介绍最近工作中项目需要嵌入式linux连接sql server数据库的要求,之前对sql server完全不了解,所以加强学习,经过半年的断断续续的开发学习,下面将自己你的经验总结一下。Freetds是一个开源的C程序库,是TDS(表列数据流)协议的再次实现,它可以被利用在Sybase的db-lib或者ct-lib库。
2014-10-18 10:57:31
2591
1
原创 关于僵尸进程
在fork ()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init
2014-02-10 17:00:29
509
原创 关于SIGPIPE信号
我写了一个服务器程序,在Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试. 但是服务器总是莫名退出,没有core文件.最后问题确定为, 对一个对端已经关闭的socket调用两次write, 第二次将会生成SIGPIPE信号, 该信号默认结束进程.具体的分析可以结合TCP的"四次握手"关闭. TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个
2014-02-10 16:49:12
519
转载 深入理解typedef
typedef作为类型定义关键字,用于在原有数据类型(包括基本类型、构造类型和指针等)的基础上,由用户自定义新的类型名称。 在编程中使用typedef的好处,除了为变量取一个简单易记且意义明确的新名称之外,还可以简化一些比较复杂的类型声明。比如: typedef int INT32;将INT32定义为与int具有相同意义的名字,这样类型INT32就可用于类型声明和类型
2013-04-16 21:53:36
390
原创 Linux多线程──生产者消费者
生产者消费者问题这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产
2013-04-16 18:34:35
457
原创 Linux下C语言实现多线程文件复制
1、具体思路把一个文件分成N份,分别用N个线程copy, 每个线程只读取指定长度字节大小的内容 最后一个线程的源文件所指定的结束位置是文件的实际大小 每个线程读取指定源文件部分的起始位置和结束位置的内容到缓冲区 每个线程将缓存中的内容写入目的文件的指定开始位置和结束位置 主线程必须等到所有线程copy完成后才能退出 2.有关文件操作的函数
2013-04-16 18:27:11
772
原创 Linux内核中的信号机制 从用户层到内核层
信号机制是类UNIX系统中的一种重要的进程间通信手段之一。我们经常使用信号来向一个进程发送一个简短的消息。例如:假设我们启动一个进程通过socket读取远程主机发送过来的网络数据包,此时由于网络因素当前主机还没有收到相应的数据,当前进程被设置为可中断等待状态(TASK_INTERRUPTIBLE),此时我们已经失去耐心,想提前结束这个进程,于是可以通过kill命令想这个进程发送KILL信号,内核会
2013-04-16 18:00:45
1939
原创 Linux静态库和动态库
库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。 静态库和动态库的区别1. 静态函数库 这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因
2013-04-16 17:43:25
497
原创 scanf的陷阱
scanf函数从标准输入流得到数据。以下几点需要注意: 1、scanf的返回值表示成功读入数据的个数。何为成功读入?例如,scanf("%d%d", &a, &b); 要求读入2个十进制的整数,scanf会到输入缓冲区中寻找。如果成功找到2个整数就返回2;如果找到1个就返回1,表示只有a被成功读入;如果找完整个输入缓冲区都没有找到,就返回0,表示读入失败。程序如下:#includ
2013-04-15 21:44:57
827
转载 strcpy,sprintf,memcpy的区别, Sizeof与Strlen的区别
strcpy,sprintf,memcpy的区别strcpy 函数操作的对象是 字符串,完成 从 源字符串 到 目的字符串 的 拷贝 功能。snprintf 函数操作的对象 不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现 (字符串或基本数据类型)向 字符串 的转换 功能。如果源对象是字符串,并且指定 %s 格式符,也可实现字
2013-04-15 21:22:44
632
转载 符号链接与硬链接的区别
Linux 文件系统最重要的特点之一是它的文件链接。链接是对文件的引用,这样您可以让文件在文件系统中多处被看到。不过,在 Linux 中,链接可以如同原始文件一样来对待。链接可以与普通的文件一样被执行、编辑和访问。对系统中的其他应用程序而言,链接就是它所对应的原始文件。当您通过 链接对文件进行编辑时,您编辑的实际上是原始文件。链接不是副本。有两种类型的链接:硬链接和符号链接。
2013-04-15 20:07:39
678
转载 linux-多线程
一、什么是线程? 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。二、什么时候使用多线程? 当多个任务可以并行执行时,可以为每个任务启动一个线程。三、线程的创建
2013-04-15 19:40:23
448
转载 C语言scanf函数详细解释
函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。其调用格式为: scanf("",);scanf()函数返回成功赋值的数据项数,出错时则
2013-04-14 15:49:09
625
转载 Linux C编程--打开和关闭流
以下函数用于打开和关闭一个流。#include FILE * fopen (const char *pathname, const char *opentype);int fclose (FILE *stream);FILE * freopen (const char *pathname, const char *opentype, FILE *stream);fopen(
2013-04-14 14:09:55
572
转载 exec函数族实例解析
fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。),也就是这两个进程做完全相同的事。在fork后的子进程中使用exec函数族,可以装入和运行其
2013-04-13 20:36:56
548
转载 linux fork函数与vfork函数
一、fork1. 调用方法#include #include pid_t fork(void);正确返回:在父进程中返回子进程的进程号,在子进程中返回0错误返回:-1 子进程是父进程的一个拷贝。即,子进程从父进程得到了数据段和堆栈段的拷贝,这些需要分配新的内存;而对于只读的代码段,通常使用共享内存的方式访问。fork返回后,子进程和父进程都从调用fork函数返回
2013-04-13 20:26:51
439
转载 C语言 陷阱
1:strlen 的陷阱strlen在标准库中的原型是size_t strlen(char const *string);问题出在size_t上,它是在stddef.h中定义的无符号整数类型。由于无符号整数类型的运算不会出现负数,所以就导致如下陷阱:strlen(x) > strlen(y) ;不等价于strlen(x) - strlen(y) >0;举例说:s
2013-04-13 13:33:30
1097
uip1.0协议栈
2013-11-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人