C语言中time_t数据类型详细介绍
摘要:From: http://maxim.eefocus.com/xuefu2009/blog/10-03/187348_f456a.html包含文件:#ifndef__TIME_T#define__TIME_T /* 避免重复定义 time_t */typedef long time_t; /* 时间值time_t 为长整型的别名*/#endif既 然time_t实际上是长整型,到未来的某一天,从一个时间点(一般是1970年1月1日0时0分0秒)到那时的秒数(即日历时间)超出了长整形所能表示 的数的范围怎么办?对time_t数据类型的值来说,它所表示的时间不能晚于2038年1月18日19时14分
阅读全文
posted @
2012-07-10 10:18
清清飞扬
阅读(14579)
推荐(0) 编辑
彻底搞清楚C/C++中日期和时间 time_t与struct tm,time(NULL),ctime;strftime
摘要:From: http://blog.csdn.net/byrsongQQ/article/details/5790445本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元)1.概念在C/C++中,对字符串的操作有很多值得注意的问题,同样,C/C++对时间的操作也有许多值得大家注意的地方。
阅读全文
posted @
2012-07-10 10:10
清清飞扬
阅读(5987)
推荐(0) 编辑
linux ftok()函数
摘要:系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。ftok原型如下:key_t ftok( char * fname, int id )fname就时你指定的文件名(该文件必须是存在而且可以访问的),id是子序号,虽然为int,但是只有8个比特被使用(0-255)。当成功执行的时候,一个key_t值将会被返回,否则 -1 被返回。 在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。如指定文件的索引节点号为65538,换算成16进制为 0x010002,而你指定的ID值为38,换算成16进制为0x26.
阅读全文
posted @
2011-05-31 21:14
清清飞扬
阅读(58704)
推荐(2) 编辑
如何让errno多线程/进程安
摘要:在linux或者unix环境中,errno是一个十分重要的部分。在调用的函数出现问题的时候,我们可以通过errno的值来确定出错的原因,这就会 涉及到一个问题,那就是如何保证errno在多线程或者进程中安全?我们希望在多线程或者进程中,每个线程或者进程都拥有自己独立和唯一的一个 errno,这样就能够保证不会有竞争条件的出现。一般而言,编译器会自动保证errno的安全性,但是为了妥善期间,我们希望在写makefile的时 候把_LIBC_REENTRANT宏定义,比如我们在检查<bits/errno.h>文件中发现如下的定义:# ifndef __ASSEMBLER__/* Fun
阅读全文
posted @
2011-05-31 20:47
清清飞扬
阅读(1860)
推荐(0) 编辑
共享内存---shmget shmat shmdt
摘要:要使用共享内存,应该有如下步骤:1.开辟一块共享内存 shmget()2.允许本进程使用共某块共享内存 shmat()3.写入/读出4.禁止本进程使用这块共享内存 shmdt()5.删除这块共享内存 shmctl()或者命令行下ipcrmftok()。它有两个参数,一个是字符串,一个是字符。字符串一般用当前进程的程序名,字符一般用来标记这个标识符所标识的共享内存是这个进程所开辟的第几个共享内存。ftok()会返回一个key_t型的值,也就是计算出来的标识符的值。shmkey = ftok( "mcut" , 'a' ); // 计算标识符操作共享内存,我们用
阅读全文
posted @
2011-05-28 15:39
清清飞扬
阅读(3787)
推荐(0) 编辑
Linux系统下的多线程编程入门
摘要:线程的数据处理 和进程相比,线程的最大优点之一是数据的共享性,各个进程共享父进程处沿袭的数据段,可以方便的获得、修改数据。但这也给多线程编程带来了许多问题。我们必须当心有多个不同的进程访问相同的变量。许多函数是不可重入的,即同时不能运行一个函数的多个拷贝(除非使用不同的数据段)。在函数中声明的静态变量常常带来问题,函数的返回值也会有问题。因为如果返回的是函数内部静态声明的空间的地址,则在一个线程调用该函数得到地址后使用该地址指向的数据时,别的线程可能调用此函数并修改了这一段数据。在进程中共享的变量必须用关键字volatile来定义,这是为了防止编译器在优化时(如gcc中使用-OX参数)改变它.
阅读全文
posted @
2011-05-28 08:50
清清飞扬
阅读(689)
推荐(0) 编辑
取得系统时间并以BCD形式保存到字符串中
摘要:#include <stdio.h>#include <time.h>#define HEX2BCD(x) (((x) % 10) + ((((x) / 10) % 10) << 4)) /*20 -> 20H*/#define UINT8 unsigned char/* 功能:获取BCD时间 out: [out] 保存获取到的BCD时间,格式为:秒分时日月年(各占一字节,BCD格式)*/void getBCDTime(UINT8 *out){ time_t t; int i = 0; struct tm *tp = NULL; t = time(NU
阅读全文
posted @
2011-05-27 15:31
清清飞扬
阅读(1238)
推荐(0) 编辑
OCI读取单条记录(C)
摘要:开发环境:fedora12 + oracle-client11 + eclipse目标数据库:oracle10g一、准备1. 建表Create Table testTable_OCI( SID int primary key, Seq varchar2(10), UName varchar2(20), Introduce VARCHAR2(2000), Intime DATE default sysdate)-- Create sequence create sequence TESTTABLE_OCISEQminvalue 1maxvalue 9999999999999999999999st
阅读全文
posted @
2011-04-26 06:02
清清飞扬
阅读(1830)
推荐(1) 编辑
Oracle常用的OCI函数
摘要:一. Oracle oci工具包安装: $ORACLE_HOME\BIN:执行文件和help文件 $ORACLE_HOME\OCI\INCLUDE:头文件 $ORACLE_HOME\OCI\LIB\BC: for Borlanf C++的OCI库 $ORACLE_HOME\OCI\LIB\MSVC: for MS Visual C++的OCI库 如果是unix下,对于ORACLE8i,则OCI库在$ORACLE_HOME/lib下,如果是9i,则在$ORACLE_HOME/lib32下,库文件名一般为libclntsh.so 1. 创建OCI环境即创建和初始化OCI工作环境,其他的OCI函数需
阅读全文
posted @
2011-04-24 21:15
清清飞扬
阅读(14043)
推荐(1) 编辑
C语言输出“I LOVE U”
摘要:#include <stdio.h>#include <windows.h>#define N 50HANDLE hConsole; void gotoxy(int x, int y) { COORD coord; coord.X = x; coord.Y = y; SetConsoleCursorPosition(hConsole, coord); } void main(){ int i,j,k; hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hConsole, FOREGRO
阅读全文
posted @
2011-04-16 12:27
清清飞扬
阅读(2383)
推荐(0) 编辑
C和C++混合编程
摘要:From: http://blog.ednchina.com/tianlebo/479334/message.aspxextern "C"表示编译生成的内部符号名使用C约定。C++支持函数重载,而C不支持,两者的编译规则也不一样。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字可能为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_
阅读全文
posted @
2011-04-13 14:01
清清飞扬
阅读(1216)
推荐(0) 编辑
gcc和g++的区别(很详细的描述)
摘要:gcc和g++都是GNU(组织)的一个编译器。 误区一:gcc只能编译c代码,g++只能编译c++代码 两者都可以,但是请注意: 1.后缀为。c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为。cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。 2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。 误区二:gcc不会定义__
阅读全文
posted @
2011-04-13 09:30
清清飞扬
阅读(3744)
推荐(0) 编辑
Linux 下编译hello world 的C 语言程序
摘要:本来我用的是这样的程序# include <iostream.h>int main(void){ int i,j; j=0; i=j+1; cout<<"hello world!"<<endl; cout<<"the result is"<<i<<endl; return 0;}利用g++ -o test test.cpp。但是这样是有错误的,提示无法打开iostream.h,修改成这样的程序# include <iostream>using namespace std;
阅读全文
posted @
2011-04-13 09:24
清清飞扬
阅读(1102)
推荐(0) 编辑
C语言实现二维数组操作--元素个数确定
摘要:代码如下:/* 本例用于测试C语言实现二维数组的创建、输出和内存释放 结论:二维数组只适合数组元素个数确定的情况,如果元素个数不确定,最好是用链表。*/#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 5// 创建并初始化二维数组char** get2DArray(int n){ int i = 0; char temp[256] = {0}; char **p = malloc(sizeof(char*) * n); for(i = 0; i < n; i++) { p
阅读全文
posted @
2011-04-12 22:09
清清飞扬
阅读(4552)
推荐(1) 编辑
浅谈C中的wprintf和宽字符显示
摘要:转自:http://blog.csdn.net/lovekatherine/archive/2007/11/06/1868724.aspx [在此向原文作者说声谢谢!若有读者看到文章转载时请写该转载地址,不要写我的BLOG地址。尊重他人的劳动成果 ^_^ ]今天在CSDN的Blog首页看到一篇文章“也谈计算机字符编码 ”,由于前一阵业余翻译了“UTF-8 and Unicode FAQ for Unix/Linux”一文,自己对字符集、编码和Unicode等内容一直保着者很强的兴趣,自然不会放过这样的文章。作者的文章写得很明白易懂,虽然有一些概念上的细节问题我觉得有商榷之处;作者还给出一个简单
阅读全文
posted @
2011-04-11 23:41
清清飞扬
阅读(725)
推荐(0) 编辑
同样的c代码,为何在windows下和linux下执行结果不一样?
摘要:代码如下:#include <stdio.h>#include <string.h>int main() { char *in_utf8 = "你在干吗呢"; char *in_gb2312 = "安装超人"; char *in_eng = "English man"; printf("len1=%d, len2=%d, len3=%d\n", strlen(in_utf8), strlen(in_gb2312), strlen(in_eng)); return 0;}在windows下,运
阅读全文
posted @
2011-04-11 22:58
清清飞扬
阅读(3212)
推荐(0) 编辑
fopen与open的区别
摘要:open和fopen的区别:1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存 “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, fre
阅读全文
posted @
2011-04-11 22:22
清清飞扬
阅读(57625)
推荐(7) 编辑
段错误bug的调试
摘要:我们在用C/C++语言写程序的时侯,内存管理的绝大部分工作都是需要我们来做的。实际上,内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难免会在此处犯些小错误,而通常这些错误又是那么的浅显而易于消除。但是手工“除虫”(debug),往往是效率低下且让人厌烦的,本文将就"段错误"这个内存访问越界的错误谈谈如何快速定位这些"段错误"的语句。下面将就以下的一个存在段错误的程序介绍几种调试方法: 1 dummy_function (void) 2 { 3 unsigned char *ptr = 0x00; 4 *ptr = 0x00; 5 } 6 7 i
阅读全文
posted @
2011-04-11 12:39
清清飞扬
阅读(2349)
推荐(2) 编辑
C语言判断文件编码格式
摘要:/* 功能:实现文件编码格式的判断 通过一个文件的最前面三个字节,可以判断出该的编码类型: ANSI: 无格式定义;(第一个字节开始就是文件内容) Unicode: 前两个字节为FFFE; Unicode big endian: 前两字节为FEFF; UTF-8: 前两字节为EFBB,第三字节为BF*/#include <stdio.h>#include <stdlib.h>#include <string.h>// 读取一个文件的最前面n个字节,并以十六进制形式输出每个字节的值void readNBytes(char *fileName, int n){
阅读全文
posted @
2011-04-11 10:45
清清飞扬
阅读(9744)
推荐(3) 编辑
C语言创建UTF-8编码文本文件
摘要:用二进制方式创建一个文件,然后写UTF-8文件头(必须在后续写之前) char header[3] = {0xef, 0xbb, 0xbf}; // UTF-8 file header FILE * fp = fopen(pszFile, "w+b"); fwrite(line, sizeof(char), 3, fp); /*在UTF-8文件头部之后写入其他信息 */ fclose(fp);这样这个文件就成为UTF-8编码的文本文件了。之后其他信息都写在UTF-8文件头部之后就OK了!
阅读全文
posted @
2011-04-11 01:20
清清飞扬
阅读(6376)
推荐(3) 编辑