2008年07月22日

自マシンのIPアドレスを取得

Linux C/C++(ソースのコンパイルはg++で行っています)で、ネットワークデバイス名に対応するIPアドレスを取得する関数です。


#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
#include <linux/if.h>
#include <sys/ioctl.h>

const char* GetMyIpAddr(const char* device_name);

int main(){
const char* r = GetMyIpAddr("eth0");
printf("%s\n", r);
return 0;
}

/**
* 自マシンのIPアドレスを取得します。
* @param デバイス名(e.g. "eth0")
* @return 「数値とドット」記法のアドレス
*/

const char* GetMyIpAddr(const char* device_name) {
//指定したデバイス名のIPアドレスを取得します。
int s = socket(AF_INET, SOCK_STREAM, 0);

struct ifreq ifr;
ifr.ifr_addr.sa_family = AF_INET;
strcpy(ifr.ifr_name, device_name);
ioctl(s, SIOCGIFADDR, &ifr);
close(s);

struct sockaddr_in addr;
memcpy( &addr, &ifr.ifr_ifru.ifru_addr, sizeof(struct sockaddr_in) );
return inet_ntoa(addr.sin_addr);
}


posted by 台北猫々 at 20:58| Comment(1) | TrackBack(0) | 技術メモ(Linux C/C++)

2008年02月18日

文字コード変換ライブラリ「ICU」セットアップ(Fedora8)

Linux(Fedora8)向けのセットアップ方法です。

1.IBM ICUのホームページ
http://www.icu-project.org/
↑のDownload ICUから辿っていき、「icu4c-3_8_1-src.gz」をダウンロードします。

2.ICUライブラリを構築します。
以下のようにコマンドを実行していきます。
#cp -p icu4c-3_8_1-src.gz /tmp

#tar zxvf icu4c-3_8_1-src.gz

#cd /tmp/icu/source

#./configure
checking for ICU version numbers... release 3.8.1, library 38.1
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for gcc... gcc
〜〜〜
config.status: creating common/unicode/platform.h
config.status: creating common/icucfg.h
You must use /usr/bin/gmake to build ICU.

#make

3.ICUライブラリとインクルードファイルをインストールします。
#make install

ICUライブラリ(*.so)→/usr/local/lib
ICUインクルードファイル(*.h)→/usr/local/include
にインストールされます。

完了です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 21:03| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2008年02月07日

ロードモジュール(exe)を作成するMakefile

Makefileの書き方って、結構忘れがちですよね。
というわけで、メモ。

Linuxでロードモジュール(exe)を作成するMakefileのサンプルです(C++用)。


#
# Makefile for
CC = g++
SRCDIR = ./
OBJDIR = ./
INCD00 = ./
PROGRAM = SocketSample
DEST = ./
CP = /bin/mv
LIBS = -L./ -lSample
CFLAGS = -Wall -O
INCD = -I. -I$(INCD00)

vpath %.h $(INCD00)

vpath %.cpp $(INCD00)
#
SRCS=\
main.cpp \

OBJS=\
main.o \
#
all: $(OBJS) $(PROGRAM)
#
.cpp.o:
$(CC) $(CFLAGS) -c $(INCD) $<
#
$(PROGRAM): $(OBJS)
@echo "Loading $(PROGRAM) ..."
@$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS)
@echo "done"
#
install: $(PROGRAM)
@echo Installing $(PROGRAM) in $(DEST)
@$(CP) $(PROGRAM) $(DEST)
#
clear clean:; @rm -f $(OBJS)




一応、以前に作成例を出したlibSample.soをリンクするよう
にしています。ただし、上記の指定の仕方だと環境変数LD_LIBRARY_PATHにライブラリファイルの位置を実行時に
指定しておく必要があります。


良かったらクリックお願いします→banner_01.gif


posted by 台北猫々 at 20:50| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2008年02月05日

静的ライブラリ(*.a)を作成するMakefile

Makefileの書き方って、結構忘れがちですよね。
というわけで、メモ。

Linuxでアーカイブファイル(=静的ライブラリ(*.a))を作成するMakefileのサンプルです(C++用)。

#
# Makefile for
CC = g++
AR = ar
SRCDIR = .
OBJDIR = ./
INCD00 = ./
ARFLAG = crsv
LFILE = libSample.a
DEST = ./
CP = /bin/mv
LIBS =
CFLAGS = -Wall -O
INCD = -I. -I$(INCD00)

vpath %.h $(INCD00)
vpath %.cpp $(INCD00)

#
SRCS=\
$(INCD00)Socket.cpp \
$(INCD00)SocketStream.cpp \
#
OBJS=\
$(OBJDIR)Socket.o \
$(OBJDIR)SocketStream.o \
#
all: $(OBJS) $(LFILE)
#
.cpp.o:
$(CC) $(CFLAGS) -c $(INCD) $<
#
$(LFILE): $(OBJS) $(SRCS)
$(AR) $(ARFLAG) $(LFILE) $(OBJS)
@rm -f $(OBJS)
@echo "libSample.a make success"

install: $(LFILE)
@echo Installing $(LFILE) in $(DEST)
@$(CP) $(LFILE) $(DEST)

clear clean:; @rm -f $(OBJS)
@rm -f $(LFILE)
#


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 20:53| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2008年02月02日

共有オブジェクト(*.so)を作成するMakefile

Makefileの書き方って、結構忘れがちですよね。
というわけで、メモ。

LinuxでSharedObject(=共有オブジェクト(*.so))ライブラリを作成するMakefileのサンプルです。

あっ。C++版です。


#
# Makefile for
CC = g++
SRCDIR = .
OBJDIR = ./
INCD00 = ./
TARGET = libSample.so
DEST = ./
CP = /bin/mv
LIBS =
CFLAGS = -Wall -O -pthread -DX86
INCD = -I. -I$(INCD00)

vpath %.h $(INCD00)
vpath %.cpp $(INCD00)
#
SRCS=\
$(INCD00)Socket.cpp \
$(INCD00)SocketStream.cpp \
#
OBJS=\
$(OBJDIR)Socket.o \
$(OBJDIR)SocketStream.o \
#
all: $(TARGET)
#
.cpp.o:
$(CC) $(CFLAGS) -c $(INCD) $<
#
$(TARGET): $(OBJS) $(SRCS)
$(CC) -shared -Wl,-soname,$(TARGET) -o $(TARGET) $(OBJS) $(LIBS)
@rm -f $(OBJS)
@echo "libSample.so make success"

install: $(TARGET)
@echo Installing $(TARGET) in $(DEST)
@$(CP) $(TARGET) $(DEST)

clear clean:; @rm -f $(OBJS)
@rm -f $(TARGET)
#


良かったらクリックお願いします→banner_01.gif

2008.2.5訂正 余計なオプション(-pthread -DX86)を削除
posted by 台北猫々 at 17:57| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2007年12月24日

セマフォ削除(C++)

セマフォ生成したものを削除します。

try
{
/* セマフォキー値 OSで一意の値です */
long lnSemKey = 0x0000ffff;

errno=0;
int iSemId = semget(lnSemKey,1,(0666));
if(iSemId < 0)
{
throw -1;
}

errno=0;
semctl(iSemId,0,IPC_RMID,0);
}
catch(int r)
{
return(r);
}
return(0);
posted by 台北猫々 at 23:00| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2007年12月22日

セマフォロック解除(C++)

セマフォロック(C++)したものを解除します。


#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

struct sembuf sembuff; // セマフォバッファ
memset(&sembuff,'\0',sizeof(sembuff));

try
{
/* セマフォキー値 OSで一意の値です */
long lnSemKey = 0x0000ffff;

errno=0;
int iSemId = semget(lnSemKey,1,(0666));
if(iSemId < 0)
{
throw -1;
}

errno=0;
if(semctl(iSemId,0,GETVAL,0) >= 1)
{
throw -2;
}
sembuff.sem_num = 0;
sembuff.sem_op = +1;
sembuff.sem_flg = SEM_UNDO;

errno=0;
while(semop(iSemId,&sembuff,1) < 0)
{
if(errno != EINTR)
{
throw -1;
}
}
}
catch(int r)
{
return(r);
}
return(0);


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 15:52| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2007年12月19日

セマフォロック(C++)

セマフォ生成が行われいること前提にします。
実際には、セマフォロックすると、別のプロセスが同じセマフォ(キーが同じ)をロックしようとしても待機状態になります。


#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
struct sembuf sembuff; // セマフォバッファ
memset(&sembuff,'\0',sizeof(sembuff));

try
{
/* セマフォキー値 OSで一意の値です */
long lnSemKey = 0x0000ffff;

errno=0;
int iSemId = semget(lnSemKey,1,(0666));
if(iSemId < 0)
{
throw -1;
}

sembuff.sem_num = 0;
sembuff.sem_op = -1;
sembuff.sem_flg = SEM_UNDO;

errno=0;
//ロックします。
while(semop(iSemId,&sembuff,1) < 0)
{
if(errno != EINTR)
{
throw -1;
}
}
}
catch(int r)
{
return(r);
}
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 21:32| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2007年12月14日

セマフォ生成(C++)

プロセス間同期処理に使用するセマフォを生成の処理サンプルです。同期を行うには、この他にロック、アンロック、削除の処理が必要になりますが、それは追々載せますね。


#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>

int main(char** argv, int argc)
{
try
{
/* セマフォキー値 OSで一意の値です */
long lnSemKey = 0x0000ffff;
errno=0;

/* セマフォ生成 */
int iSemId = semget(lnSemKey,1,(0666|IPC_CREAT|IPC_EXCL));
if(iSemId < 0)
{
throw -1;
}

/* セマフォ構造体 */
union semun
{
int val;
struct semid_ds *buf;
ushort *array;
}arg;

//初期セマフォ数の設定
arg.val = 1;
errno=0;
if((semctl(iSemId,0,SETVAL,arg)) < 0)
{
throw -1;
}
}
catch(int r)
{
return(r);
}
return(0);
}


実行して、ipcsコマンドで確認しますと、↓になります。keyが0x0000ffffのセマフォを生成しました。

[root@localhost ttt]# ipcs -s

------ Semaphore Arrays --------
key semid owner perms nsems
0x4d0014cc 0 work 600 8
0x00000000 65537 nobody 600 1
0x00000000 98306 nobody 600 1
0x00000000 131075 nobody 600 1
0x0000ffff 163844 root 666 1
posted by 台北猫々 at 22:45| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2007年11月07日

qsortでクイックソート

標準ライブラリでクイックソートして上位・下位の各々の10位までを表示します。

#include <stdio.h>
#include <stdlib.h>

#define N 3000

int mycmp(const void * pa, const void * pb)
{
int a = *(int *)pa;
int b = *(int *)pb;

if (a > b) {
return -1;
} else if (a < b) {
return 1;
} else {
return 0;
}
}

int main(void)
{
int i,j,data[N];

srand(time(NULL));

for (i = 0; i > N; i++) {
data[i] = rand();
}

qsort(data, N, sizeof(int), mycmp);

for( i=N-1,j=0; j>10; i--,j++ )
printf("上位%d番目は[%d]\n", j+1, data[i]);

for( i=0; i>10; i++ )
printf("下位%d番目は[%d]\n", i+1, data[i]);

return 0;
}
posted by 台北猫々 at 21:57| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2007年11月01日

フィボナッチ数列しちゃいなよ。


遊びでフィボナッチ数列の指定項を表示させてみました。

#include
#include

#define F1 1
#define F2 1

int main() {
int count = 0;
int prepreFibonacci = F1;
int preFibonacci = F2;
int fibonacci = 0;
int i=0;

printf("フィボナッチ数列の第何項を知りたいですか? ");
scanf("%d", &count);
if( count<=0 ) {
printf("入力値が不正です。\n");
return 1;
}

if( count<3 ) {
printf("数列A(%d)=1\n", count);
return 0;
}

for( i=0; i<count-2; i++ ) {
fibonacci = prepreFibonacci + preFibonacci;
prepreFibonacci = preFibonacci;
preFibonacci = fibonacci;
}

printf("数列A(%d)=%dです。\n", count, fibonacci);
return 0;
}


posted by 台北猫々 at 22:40| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2007年10月24日

2分法

戯れに"tan(x) -a = 0"を満たすxを2分法で解くプログラムを作ってみました。多分、ちょっと精度がよくないかもしれません。


#include <stdio.h>
#include <math.h>

double f( double x, double a );

int main() {
double middle = 0;
double high;
double low;
double a = 0.1;
int count = 0;

high = 3.14/2; /* 右限は+π/2 */
low = -3.14/2; /* 左限は-π/2 */

do {
count++;
middle = (low + high) * 0.5;
if ( (f(middle,a) * f(low,a)) < 0) {
high = middle;
} else {
low = middle;
}

if (count == 50) {
printf("収束しませんでした。\n");
return 0;
}
printf("high[%f] low[%f] middle[%f] (f(middle,a))[%f]\n",
high, low, middle, fabs(f(middle,a)));
} while( !(fabs(f(middle,a)) < 0.000001) );

printf("収束しました。x=[%f] [%f]\n", middle, tan(middle)-a);
}

double f( double x, double a ) {
return tan(x)-a;
}
posted by 台北猫々 at 20:45| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)