C
文章平均质量分 50
jiangzhengdong
这个作者很懒,什么都没留下…
展开
-
c指针之字符串常量
c语言中字符串常量参与表达式时,它的值是指针常量,编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储一个指向第1个字符的指针。当数组名用于表达式中时,它们的值也是指针常量。eg:printf("%c",*("xyz"+1)); //输出为yprintf("%c","xyz"[2]); //输出为z原创 2013-03-07 21:08:28 · 623 阅读 · 0 评论 -
errno全局变量各值含义
Linux下最常见的就是errno了,一般当发生错误时便会给全局变量errno赋值,其所有可能的值可查看linux的源码,以下是查看linux v3.6源码的结果:/usr/include/asm-generic/errno-base.h#ifndef _ASM_GENERIC_ERRNO_BASE_H#define _ASM_GENERIC_ERRNO_BASE_H#d原创 2013-07-15 09:17:01 · 2168 阅读 · 0 评论 -
bzero等函数源代码实现
看《网络编程》,对bzero等函数的实现颇有兴趣,于是便翻看了其源代码的实现。bzero、bcopy、bcmp等函数源码如下:bzero源码:voidbzero(s1, n) void *s1; unsigned n;{ register char *t = s1; while (n != 0) { *t++ = 0; n--; }}bcopy源码如下:原创 2013-07-15 08:34:48 · 3126 阅读 · 0 评论 -
Core文件作用、设置及用法
1.Core文件简介Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试。当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文件,默认生成位置与可执行程序位于同一目录下,文件名为core.***,其中***是某一数字。2.开启或关闭Core文件的生成关闭或阻止core文件生成:$ulimit -c 0打开core文件生成原创 2013-07-06 19:33:17 · 9506 阅读 · 0 评论 -
GDB 单步调试
一、初始化输入gdb进入gdb调试环境。或者直接输入gdb + progfile来加载文件。注意该文件是使用gcc(或g++)编译得到的。为了使 gdb 正常工作, 必须使你的程序在编译时包含调试信息,编译时必须使用-g参数来。或者进入gdb环境后,通过命令file + progfile来加载需要调试的可执行文件文件。查看源代码:list [函数名][行数]设置转载 2013-06-02 16:59:58 · 1246 阅读 · 0 评论 -
GDB 常用调试命令
调用gdb编译需要在cc后面加 -g参数再加-o;[root@redhat home]#gdb 调试文件:启动gdb(gdb) l :(字母l)从第一行开始列出源码(gdb) break n :在第n行处设置断点(gdb) break func:在函数func()的入口处设置断点(gdb) info break: 查看断点信息(gdb) r:运行程序转载 2013-06-02 16:58:01 · 965 阅读 · 0 评论 -
剖析system()函数
system()函数调用/bin/sh来执行参数指定的命令,/bin/sh 一般是一个软连接,指向某个具体的shell,比如bash,-c选项是告诉shell从字符串command中读取命令;在该command执行期间,SIGCHLD是被阻塞的,好比在说:hi,内核,这会不要给我送SIGCHLD信号,等我忙完再说;在该command执行期间,SIGINT和SIGQUIT是被忽略的,转载 2013-06-09 15:00:40 · 801 阅读 · 0 评论 -
反汇编工具
最近上网络编程这门课,孙老师给我们介绍了下反汇编相关工具,让我对反汇编有了一个基本的认识,算是增长见识了。大概介绍了三个工具:1.source insight此工具为查看源码比较好的工具,让阅读源代码方便了许多。2.OllyDbg此工具为动态的反汇编工具3.IDA此工具为静态的反汇编工具一般都是现用IDA分析软件的整体结构,然后再用OllyDbg分析细节。要知道原创 2013-04-11 16:40:43 · 1054 阅读 · 0 评论 -
消息队列IPC(inter process communication)小记
1.获取消息队列消息队列相关的API都在sys/msg.h库中,要创建消息队列,使用函数msgget();这个函数第一个参数为消息队列ID(此Id是给定主机上唯一的描述符或关键字),第二个参数为识别消息旗标的参数,返回值是一个句柄,和文件描述符相似,指向指定Id的消息队列。int msgget(key_t key, int msgflg);key_t值必须是一个非零的值或者是特殊符原创 2013-04-06 22:46:19 · 1320 阅读 · 0 评论 -
pthread线程创建出现undefined reference to `pthread_create' collect2: error: ld returned 1 exit status
最近看《Gnu/linux编程》线程这章时,自己便试着写了一个简单实例,然后用gcc编译,结果出现:pthread.c:(.text+0x29): undefined reference to `pthread_create'collect2: error: ld returned 1 exit status。这时便发挥google的功效,问题得以解决。方法如下:只需在用gcc编译时加上-原创 2013-04-06 08:55:15 · 9174 阅读 · 0 评论 -
linux C线程杂记
以前学操作系统的进程和线程管理时,经常听到互斥加锁解锁之类的概念,但是几乎很少在编程中用到,今天看《gnu/linux编程》的线程这章时,对c程序中如何给变量加锁解锁有了一个大致的了解,现记录如下:互斥其实是保证线程在关键区正常执行的变量,同一时刻只能由某一进程访问,要建立一个关键区,首先得创建一个互斥变量,然后用特殊的符号为其常量初始化。互斥变量声明方法如下:pthread_mutex_原创 2013-04-06 12:31:17 · 752 阅读 · 0 评论 -
查看c库函数源代码
今天突然心血来潮,想一睹c的输入输出库函数具体实现,于是便搜寻,最后得知所有的库函数源代码都位于glibc中,只需要下载glibc包,然后解压即可。具体下载网址:http://ftp.gnu.org/gnu/libc/基本输入输出函数我找了半天,最终还是找到位置了,位于glibc文件夹的stdio-common子文件夹中,下面为scanf的源代码:int__scanf (const原创 2013-04-07 11:26:54 · 10981 阅读 · 0 评论 -
linux下用gdb调试c程序
首先要用gdb调试C/C++程序的话,得在编译时将调试信息添加到可执行文件中,使用gcc的 -g参数便可以做到这点。如:gcc -g -Wall -o test test.c编译完后边要启动gdb,方法如下:$gdb test如果对gdb的命令不熟,可通过help来查询,如下:(gdb)helpgdb 的命令很多,gdb把之分成许多个种类。help命令只是例出gdb的命原创 2013-03-21 23:07:00 · 835 阅读 · 0 评论 -
Online Judge计算整数的和
Problem DescriptionYour task is to calculate the sum of some integers. InputInput contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and t原创 2013-03-18 20:24:22 · 732 阅读 · 0 评论 -
c语言之五符号整型数据相减问题
看《c和指针》的9.2节时,才明白无符号整型相减会出现问题。c的strlen函数返回的是size_t类型值,两个无符号整型数据相减结果永远不可能为负数,所以:if(strlen(a)-strlen(b)>=0)恒成立,因此if(strlen(a)-strlen(b)>=0) != if(strlen(a)>=strlen(b))千万注意!!!原创 2013-03-08 22:22:11 · 2162 阅读 · 0 评论 -
内存分配知识(全局,局部,静态变量)
预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(stat转载 2013-03-07 18:09:25 · 652 阅读 · 0 评论 -
C指针错误
int main (void){ char* string = "Hello World!"; printf ("%s\n", string); replace_char(string, 10, 'a'); printf ("%s\n", string);}void replace_char(char str[], int n, char c){ str[n]原创 2013-03-07 16:21:43 · 515 阅读 · 0 评论 -
内存对齐
每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”,并且只能是2的幂。对齐规则如下:1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照 #pr原创 2013-07-15 11:32:57 · 1004 阅读 · 0 评论