平时积攒下来的东东,
#ifdef HP_UNIX
#pragma pack 1
#elif defined(AIX)
#pragma options align=packed
#elif defined(_WIN32)
#pragma pack(push,1)
#else
#pragma pack(1)
#endif
或者
gcc -fpack-struct server.c在编译时加上-fpack-struct参数来压缩"空"的部分
原来是内存对齐用的, 基本的意思就是以1字节来对齐, 而不会出现在结构中以大的字节来对齐的情况
------------------------------------------------------------------------------
关于makefile的, 有感而加注释
include $(ORACLE_HOME)/rdbms/lib/env_rdbms.mk #makefile的伪指令, env_rdbms.mk文件包含了make的规则
CC=`/bin/sh ./getopts.sh compiler` #没啥用
COMMONLIBS=`/bin/sh ./getopts.sh options` #是 -lnsl -lsocket -ldl ???
NONDEFER=false
#新发现, 在INCLUDE中加上-DLINUX 相当于在程序中写上#define LINUX, 但是加在LDFLAGS中是不对的, 不知为什么???
INCLUDE= -I$(ORACLE_HOME)/rdbms/demo -I$(ORACLE_HOME)/rdbms/public -I$(ORACLE_HO #-I是包含了.h文件啊
ME)/plsql/public -I$(ORACLE_HOME)/network/public
LDFLAGS=-L. -L$(ORACLE_HOME)/lib -L$(ORACLE_HOME)/rdbms/lib -L$(ORACLE_HOME)/lib #-L是包含了.a库文件
-L$(ORACLE_HOME)/network/lib -L/usr/lib -L/usr/local/lib
OCISHAREDLIBS=$(LLIBCLNTSH) ${COMMONLIBS} #LLIBCLNTSH是在env_rdbms.mk里定义的
OCISTATICLIBS=$(STATICTTLIBS) $(LLIBTHREAD) ${COMMONLIBS} #STATICTTLIBS、LLIBTHREAD同上
CC=gcc
#COMPILE.C= ${ECHODO} $(CC) $(INCLUDE) -c
COMPILE.C= $(CC) $(INCLUDE) -c #编译时是会用到.h头文件的
#MAKEEXE= ${ECHODO} $(CC) $(LDFLAGS) $(OCISHAREDLIBS)
MAKEEXE= $(CC) $(LDFLAGS) $(OCISHAREDLIBS) -lmd5 #形成可执行文件时是要用到库文件.a文件的
.SUFFIXES: .o .cob .for .c #.SUFFIXES是特殊目标的一种, 具体见Makefile使用说明文档
#后缀规则是干什么啊???
EXE1=ljscdmain
EXE2=ljclient
OBJ=main.o tools.o comm.o OracleDB.o BusiProc.o mml_apiex.o MscTellin.o idea.o
all: $(EXE2)
$(EXE1): $(OBJ)
$(MAKEEXE) $(OBJ) -o $(EXE1)
$(EXE2): $(OBJ)
$(MAKEEXE) $(OBJ) -o $(EXE2)
main.o: main.h main.c
$(COMPILE.C) main.c
tools.o: tools.h tools.c
$(COMPILE.C) tools.c
OracleDB.o: OracleDB.h OracleDB.c
$(COMPILE.C) OracleDB.c
comm.o: comm.h comm.c
-l与-L的不同: -l连接的库文件是指定的,eg: -lsocket; 而-L连接的是目录下的所有库文件
------------------------------------------------------------------------------
对进制转换的一些研究
short int *i = (short int *)"/01/03/02/03/0/0/0/0/0/0/0/0/0/0/0/016";
printf("%d/n", *i);
结果: 259
原因: short int是2个字节的, 所以i是/01/03代表的2个字节, 换成2进制是00000001 00000011
转化成10进制就是259了. 同理printf("%d/n", *(i+1))的结果就是/02/03对应的515了
注意: 像上面那样赋值时是要有(short int *)显示类型转换的
short int *j = (short int *)"1234";
printf("%d/n", *i);
i是12代表的2个字节, '1'对应的ascii码值是49, 即2进制的110001, '2'对应50, 2进制是110010
所以结果是12594
------------------------------------------------------------------------------
2005-11-7 10:51
查看进程
cd /proc
cd 5833 /*进入5833进程*/
file 4 /*显示是一个socket*/
------------------------------------------------------------------------------
ipcs
ipcrm
释放共享内存和信号量
ipcrm -M 0x21fd -S 0x21fc
-----------------------------------------------------------------------------------
发现一个问题, 在solaris
用fopen(...,"a")创建一个文件时, 不用往该文件里写, 并且文件是普通文件
用open(..., O_APPEND|O_CREAT)创建一个文件时, 必须往该文件里写(即用write等写入)才能创建该文件,
并且文件是可执行文件, 文件名前面带*标识
-----------------------------------------------------------------------------------
当更改完用户目录下的.cshrc后, 要使之有效的2种方法:
1.重新登陆
2.source .cshrc
就ok了
看来相关的一些配置是在.cshrc这个隐藏文件里配置的
which会找环境变量中的path定义的路径下的
记住: -D是#define
gcc -Wall 是显示所有警告信息
gcc -g 是生成调试信息在编译后的文件中, 包括地址等,很大的, 用于gdb等工具的调试
发现: cd ssrcidl也会进到idl目录, 跟有几个/无关
-----------------------------------------------------------------------------------
关于makefile, 最后下面要留一空行, 否则有警告
Warning: newline is not last character in file makefile
如果编译的是c文件, 那么就会包含一个预处理器名字__STDC__, 而c++是__cplusplus
注意这2个名字不会同时定义
c库头文件的c++名字总是前面有个c, 例如c中#include <stdio.h>. c++可以是#include <stdio.h>
或者#include <cstdio>, 但不能是#include <cstdio.h>, 会报找不到
动态分配的空间的对象是没有名字的, 唯一的访问方式是通过指针间接的访问
array._size和array.size()得到数组的维数, 但是array._size直接访问内存比array.size()调用函数快得多,
是否为了信息的隐藏而牺牲了效率呢? 一般是不, 因为有内联函数机制的