22 123
发新话题
打印

编程开发版精华FAQ

? 在RH7.1下安装Kylix会有error -10的错误,问题可能是出在RPM 4.0.2-8上。 4 y+ C0 U4 R& P3 D- i
! 我发现可以有两个方法解决:
7 v& u- N% n0 D5 o: j( t  1、ftp://ftp.rpm.org/pub/rpm/test-4.0.3/下载rpm 4.0.3+ , }2 Y/ Z7 @, g5 d) i
  2、比较简单,只要避开root自动运行rpm的步骤就行了, ! g5 {9 B- f+ Y2 H9 v3 Z2 }1 V
     sh setup.sh -m 安装即可 - X  [  v  k9 F  e3 ^& z

3 W% d; B% _6 ?0 [& G3 q; P/ E9 ?? 我下载了kylixft4.iso文件(600多M),用IOSBUSTERRS打开刻盘后,安装时老告诉我glibc版本不够高。我升级glibc到2.1.3或者是2.2 但他还是检测glibc到版本不够高。请问是怎么回事。有什么办法解决吗?
* m* Z: _. O# n) l! 你安装Red Hat7.1, 再创建一个用户, 然后以这个用户登录linux(非root就行), 再安装kylix, 定不会再有问题!!!OK!!!
. v6 q1 B! q) L, `9 h
! }5 }2 S! x7 F& h3 a? 请编程高手指教
0 |$ E* c$ K5 j2 ^我在学unix进程间通信----SYSTEM V消息队列的时候遇到如下问题 / ?5 c, h, A5 k( y2 x+ O2 g; s
[root@localhost svmsg]# make 3 w7 y# V% V9 G2 \* v
gcc -g -O2 -D_REENTRANT -Wall -c -o ctl.o ctl.c 7 Y! V& k  ?: ^; C: Z" g

& a8 p! T1 E5 f3 ?ctl.c: In function `main': 9 p5 K: y: {$ P. N0 h# K
ctl.c:8: storage size of `buf' isn't known
6 K: G, D  v. V! @9 ?# C/ n4 pctl.c:10: `MSG_R' undeclared (first use in this function)
* C' Y% t5 y: q3 zctl.c:10: (Each undeclared identifier is reported only once
* a9 H8 z; J! F+ _( |  X* {ctl.c:10: for each function it appears in.) ; I+ C. C6 u* |3 F% f- W8 w
ctl.c:10: `MSG_W' undeclared (first use in this function)
5 A& V* e2 _- N+ l4 O6 ]  ^ctl.c:18: `ulong_t' undeclared (first use in this function)
- O$ K3 _/ l/ \! s
2 W" M2 z, P+ ~) U. T  p1 g
( b. _0 W% W- g# J$ D, o下面是ctl.c文件
' v8 T6 ^' {2 f' n#include "unpipc.h" ) R4 O) q4 P% N2 e' K3 ?
* c5 M) S# T) r4 I7 r( y& r
int
7 D8 ?+ I# {: V8 |7 h0 Fmain(int argc, char **argv)
0 B% z# v! |3 p0 a0 y# j$ h) K{ 5 H4 |! I; }+ z+ L$ \
int msqid; 5 b4 d9 s0 i9 E* h
struct msqid_ds info;
: N  e( U3 m6 F# Q2 j6 O* Wstruct msgbuf buf;/*问题所在处*/ # Z3 A: L8 i& M1 E$ k

0 a0 z5 N: t( I3 q3 G2 Vmsqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);/*问题所在处*/
+ b+ W4 [1 r( `2 e$ K! ~1 w* u$ s" w3 D$ T; W6 l9 x
# \$ f( n% S/ m: D; ^1 I
/*other code*/ / T8 C7 p7 h* b$ Q% y
}
9 k& J6 [3 h3 J9 @! r- J; G( C$ N/ U+ ]
& _( x4 W" z: S8 Z+ [
下面是unpipc.h文件节选
. R2 b/ G9 E6 V+ M4 H& ^  t2 x#ifdef HAVE_SYS_MSG_H : x4 I" w; n; p) }% S3 o
# include <sys/msg.h> /* System V message queues */ % f" w' g. r5 s3 t; ~7 I
#endif 0 G3 R3 w' Y) ^) ~

8 `& g# ?7 l6 ^9 b
3 p# G  W5 Q! d2 E; b& @2 O: a#define SVMSG_MODE (MSG_R | MSG_W | MSG_R>>3 | MSG_R>>6)/*问题所在处*/ 9 l( |$ R4 z$ M, L7 A  a4 q# I
/* default permissions for new SV message queues */ - k: g9 [9 i3 ?# L* y9 z
/* $$.ix [SVMSG_MODE]~constant,~definition~of$$ */ & l6 Q# u2 J, Q: K9 O
0 E; A# l6 J& Y: |
4 Q3 z3 ~# u$ h* K3 \' X
下面是<sys/msg.h>文件 3 y& z/ S: A  i0 o* J. C# V
#ifdef __USE_GNU / B0 L! b6 N# X
/* Template for struct to be used as argument for `msgsnd' and `msgrcv'. */
& Q3 ?; k! D& \6 L9 W4 v1 i6 X# ]5 |struct msgbuf 0 V) \) G) p1 f* M3 f
{
/ |9 ^" s; I% I, m( l& W' ulong int mtype; /* type of received/sent message */
: \: A' z' f7 O+ l. l! kchar mtext[1]; /* text of the message */
* Y- ?9 U+ ^+ x  [+ e};
( R/ Y) W" q2 n2 ]#endif
2 Z3 F0 m+ U& T+ Z4 o
1 u1 {* m3 @; p. r- e( w! a9 p请各大虾多多指教!!(我用的是linux7.0)
) V' {1 H& \7 v
; w9 l9 V7 B/ k! 可以用O_RDWD 替换程序中的MSG_R||MSG_W(具体含义说明请参照<sys/fcntl.>说明; $ s7 y, W1 N- W* x' U
用ulong 替换程序中的ulong_t(或在<sys/types.h>增加ulong_t的说明.
9 H  e# `1 W6 Z, y$ |& p8 R9 p& c, W6 v6 C( {# m: y" F& d+ }' N7 I0 K

6 V- u# Q9 Q* W, Z$ E? 我试着用gcc写一个父子进程: " r' v6 z# E( o3 K0 e  B: \* \# q
if (fork()==0) 0 X; c1 ~6 s( K8 h" ?: E6 E4 A: q
{ while (1) ' j2 _& Y+ V( I2 v
{ printf("A "); 1 U! L1 u9 k4 [# S% w* t
sleep(1);
8 m- m; B( ?* `4 p! g: H. Y}
) s6 |- K; W1 x1 K0 T}else 5 m4 n4 y2 `! W/ p1 y; ?: K& }
while (1)   D2 U8 F# G: D+ A8 p" W
{ printf("B ");
! v; w# d, u, ~4 D5 B7 O% p* isleep(1);
+ H5 A# x' X3 T/ ~/ ]/ T& Z' E} $ z0 c; i3 C( I; R8 T7 v/ T
} / q. `. R1 C6 z; H- W
可是不能打印A、B。注释掉sleep,可以打印
- _! A! H" g$ r  Z+ q0 q5 U请教各位何解?
0 |$ {; @( @6 ~0 D) p8 N$ ^3 d! ?: y  I% x  p6 Y+ e
! 你加上\r\n看看!- C! `; q5 p  z- l# J' J

( L3 O! d) t+ ?! k2 w9 L! that can not make sure that two process run simultaneously.
4 P, \7 J) {  [/ _$ a6 |you should use signal to communicate between parent and child process to work cooperately.
$ C  C6 F3 y* F+ c6 a0 ]man 3 getppid
" \; W1 K! x* V% Fman 3 kill
. e2 q6 Z, N0 Y* M% p  Vman 3 signal  q& }9 E' W, M; H) K: Z

+ N7 }# L, w) b! Q8 t[已被 DarkSpy 编辑过, 在 2001-09-20  08:21]      
-----------------------------------------
http://www.darkspy.org/blog

自大的人把宗教当迷信,无知的人把迷信当宗教

TOP

(回应)

可以将函数改写成msgget(IPC_PRIVATE,IPC_CREAT | 0660)      

TOP

编程问题FAQ

Q: 为什么我用 gcc 编译出来的 a.out 不能执行?
6 ?4 A0 D( s9 G1 ^  Z- H+ Y我编辑了一个 test.c 并用 gcc 编译, 生成一个 a.out 文件
5 y1 E! |1 }1 |% ^4 w但是为什么它不能执行? 8 o+ a# ]0 M$ m. C5 ~. h

7 e# ?" t7 F; b" U% U' TA: 在 Linux 下执行程序需要指定文件路径。 请试试 ./a.out 6 ^- X1 c) x- `* l$ t& _8 c2 [
这里用 ./ 告诉 shell 要执行的程序在当前目录。
, ^5 k, ~. B% \) J& U4 q当然如果环境变量 PATH 中包含了路径, 则可以不用这样指定。 5 P- d  D& r$ L; I! k
可以通过设置用户配置文件改变它。 ; V  ^% K& m, p2 h5 m1 E2 \3 ]
如果是bsh, ksh, bash:
. D. w4 ^1 d/ c3 A4 y" _vi ~/.bashrc
" j$ @; F- A9 ^% T# I/ [% w4 u; g" a添加一行: " |/ D! M) P+ J3 U" R0 ?
PATH=$PATH:.
* t# s" y- m- ~. S9 N- p% L0 D如果是csh, tcsh: 3 d4 L; y- h" i, w
vi ~/.cshrc * G7 d7 k) E, |' P+ W. h! R6 m
添加一行:
; @. P5 R4 W+ V" J6 Usetenv PATH $PATH:.
  E; b5 E7 y0 @* s这样下次等录就可以直接执行当前目录的程序了。 8 |* F* M# _# @/ o/ V" _* k" J! C$ B
# {3 u$ T/ ~$ O5 U6 Z. b, @
Q: 编程问题: 如何在 Linux 中得到特殊键的扫描码? ( }: d; B' |& J$ x+ x$ E: E
在 DOS 下面可以通过 INT86 函数进行系统调用来得到方向键的码。 ( \4 P: i1 K: k4 s
但是在 UNIX 下用 GCC 的什么函数可以读入方向键, $ G' O3 x) e1 p  ^
又是用什么函数来输出一个方向键呢? ; V- L& [0 J- E

( W1 f' F1 n9 T0 T1 ^3 S6 ZA: A: there is structure kbentry defined in /usr/include/linux/kd.h + b( a, b0 N. Y$ t

+ f; m3 c' F0 j& y2 B. gand,u can find definitions of the structure’s members in 3 W7 E9 ~# u8 A: ]( m

" O. h0 q# f' {- |4 B/usr/include/linux/keyboard.h,
6 F7 F. s' n! M% I$ L# |4 R
: V7 L) @0 P: J! zthen use ioctl() to set the keymap,and read() to read the
: E0 E8 C& |! X+ [+ ]& X* r( t. A. T8 g# H5 g  ]
value retured when a key being pressed.
; a+ t! d0 L9 z2 ?) L0 A* W1 y6 _1 a# u
Q: 编程问题: 关于文件结束的判断偶要对一个log文件进行分析,通过下面的方法打开 ) P+ V" T9 i. }4 ~0 l2 O- f
if ((fp=fopen(free,"r+"))==NULL){ //the free ip file created by manual printf("can’t open file %s.",free); ' A' P: |9 n0 B) h
putchar(’\n’);
: C  i4 p0 ~& }3 P/ R) H7 Wexit(0); 6 k0 E& e; S7 Y' X* {/ k
} 9 S" g8 z9 K9 {1 ~) W
通过fgets函数从fp流中取出字符串验证,正确! ) V0 W, z. w% T+ S. E9 t  O
但当偶用while(fgetc(fp)!=EOF){}进行提取分析时,却发生 * ?7 R0 v  [  s) w, S
"Segmentation fault"错误!
( s" \! K' O  J7 p1 w% Y2 F. ]呜呼!为什么????? $ @9 k! c2 j$ p" ?& |

8 _& R' l# C& _5 lA: "Segmentation fault"错误! % m; ~' T- d2 O1 z- D
~~~~~~~~~~~~~~~~~~~ 这种错误是因为指针为空。 % ]: W2 e0 a: {/ @: q
而且用EOF作为文件结束的标志不太好,可能文件结束了还是!=EOF。
9 e+ d0 ]9 _* S! |" G9 `5 U. J- A( v) c1 E7 o- T
Try to use:
3 m6 E/ Q  p+ q% P/ V; V* F. g$ l: {while(!feof(fp)) { 1 ^* O4 k; H9 e6 N
fgetc(fp); ) p3 z: m  `. T/ e
} + r* m- M& H+ m
试试看。      

TOP

Q: gcc -o hello hello.c之后,在用gdb进行调试时,用list或break为何不行?
: U7 h0 e+ B: D
0 m) s) t! ~% G5 M; mA: 在编译的时候加-g选项,如:gcc -o hello -g hello.c.
  A! P& i+ u2 @% S
+ }0 k  m) w/ V" s# A# ^6 P) {Q: 如何跟踪子进程?7 K4 N4 k( n" S2 O3 n5 q

2 F2 `' E# K6 ^4 ?A: 可在子进程中设置sleep,然后可用attach pid对子进程进行跟踪。多个子进程则可多开几个gdb分别attach然后跟踪.6 x4 k! H, g0 T& ]- L0 F; P
4 J* O, m  ~& G3 a0 s. O, j% w
更多的关于gcc和gdb的使用方法可到www.gnu.org
' j2 M1 K& G2 w& L  X的Online Document获得。      
class faraway : public GNU { public: faraway() : _M_name("faraway"), _M_sex("Male"), _M_age(26) { } ~faraway(); private: std::string _M_name; std::string _M_sex; unsigned long _M_age; };

TOP

Q: linux下都有哪些C/C++开发工具?
# i% U7 e( S8 n' q* J
3 p  ^  E. i! h) v, K# ?A: 比较经典的编辑工具有vi、emacs等,她们有命令行版和图形版。编译工具有gcc,调试工具有gdb.这些工具一般都会预装。9 ?& r' Z, h4 ?. J
   GUI的IDE则有Kdevelop、Anjuta等。更多的关于kdevelop的信息可到www.kdevelop.org获得,Anjuta可到http://anjuta.sourceforge.net      
class faraway : public GNU { public: faraway() : _M_name("faraway"), _M_sex("Male"), _M_age(26) { } ~faraway(); private: std::string _M_name; std::string _M_sex; unsigned long _M_age; };

TOP

MAKEFILE简单介绍
! U# M) n. Q" A0 H[]什么是make?
9 y4 H/ x& b5 U. F5 b
9 v& r9 X4 e1 ~3 y    Unix(Linux)是一个天生的开发平台,make是一个强力的工具.它能7 `2 C- Y# ?! S9 f1 \5 x* e
自动跟踪相互依赖的源代码块并组成一程序,使得很容易建立一可执行程序.Make就是这种有依赖关系的部分和代码之间所作的规格说明.% X% G& c. \# S8 l) F1 I# R- l5 c3 W: q
+ h4 A- R, z7 N; e  y% G0 T/ b
[] 所有的程序都要使用make?
0 A, a0 p9 Q, N, {) K    是的.尽管你只有几个简单的模块,但你需要有一种结构来支持它从简单走向复杂.除非你的程序已经盖棺定论.& ^# ^6 k; m. s7 F  I$ S$ l
; D( g* `' k0 Q8 y" A# o" q
[]Makefile由哪些组成?
& b3 X" w8 x' d7 @, X    Makefile由以下几个部分组成:
) n0 ^2 p2 W7 \' z- ~: F, m, k
5 W3 R: k4 N) g2 H1 G* @    注释.
# C) S" q2 g& A) |3 v+ y; {    ^^^^
4 z  V7 m. D3 G    使用#符号插入.make将忽略#之后的任何内容以及其后的RETURN键.
% G7 S  v/ D- ]* o0 c2 \
( ~1 y6 u# b1 u$ o    变量.4 f! |" }, F: {" ]# N5 l. G: S
    ^^^^
: P2 y- [1 _7 ~. I+ d    make允许定义与SHELL变量类似的有名变量.比如,你定义了SOURCES=prog.c,那么该3 g7 i# W' z9 b; N0 @$ Z; X2 u
变量的值$(SCOURES)就包含了源文件名.
! P* p0 N% p2 \( {! a' V2 {
, |/ G% r* f6 E5 l7 c& @6 M6 a$ ^    依赖关系.$ k. k% ^# d- `. I# b
    ^^^^^^^^
9 n) ^, ^4 U; N/ Z. v    左边是目标模块,后接一冒号.再接与该模块有依赖关系的模块.9 Z  V3 H4 W, w; V
% C* a: S3 D" x% I0 s/ j7 }' m
    命令.   
! Z0 e& E- o" Q& q& B/ R    ^^^^
2 o8 n  [2 y/ s+ O    以TAB键开始(即使用相同数量的空格也不能代替它).
: d7 J  x) p$ ?: |! U# O8 v, f, _7 b! o" o$ U. p  N

- a, ]7 T0 a, m8 }[]Makefile示例
8 T) G) N+ L6 E/ u" N    下面介绍一个简单的示例来说明make的用法.假设你的程序有两个源文件main.c和my! P# u' g1 m$ X8 V1 U" D, v
c.c,一个位於子目录include下的头文件myhead.h,一个库由三个源文件myrout1.c,myrou
: ?$ T( T+ B7 w% J% v$ ht2.c,myrout3.c产生.
# p3 O: m4 i4 o0 B    其makefile文件为:
/ P/ m6 y9 B, X6 T[CODE]
4 i9 a! o0 [* F; C& i& w    #一个基本的MAKEFILE文件.
5 ?5 x( X( T: s  s3 S    #其中包括个人的头文件和个人库.
& I' S; k( s9 B4 I    HEADERS=include/myhead.h. ?: v/ _" t5 W+ o$ `
    SOURCES=main.c myc.c: [; |7 w8 r2 z! K* g% c2 z2 s9 L
    PRODUCT=$(HOME)/bin/tool
1 Z" l& }5 |8 l* C/ M, u    LIB=myrout.a6 E2 |! k/ @. k5 U  F7 g  i' M8 K
    LIBSOURES=myrout1.c myrout2.c myrout3.c) ^" E: P1 f- {8 G5 J
    CC=cc
' I5 r3 ?" ?4 b% N" K& s    CFLAGS=-g
% t6 e% w4 Z; ?7 }    all(PRODUCT)
$ t% U" J. }' M5 p% ]2 S    $(PRODUCT)(SOURCES)
4 {8 Q% y$ K6 {) l. k& B7 F        $(CC)$(CFLAGS) -o $(PRODUCT)$(SOURCES)
9 M5 U8 Z. l' u( }6 a    lint(PRODUCT)
: s& C6 R* p3 G+ V, u" B        lint $(SOURCES)$(LIBSOURCES)[/CODE], I: z( c- t1 }, }7 ]
    哈哈,挺象SHELL编程的.如果你与我一样使用LINUX下的gcc,那么只要把上面的CC=cc改为CC=gcc即可.怎么样,想来一个更复杂点的吗?7 b) V$ @6 H+ s% C) G1 S

6 [9 c" S- R3 L! ^% a3 K$ d  c[]一个更为复杂的Makefile
4 m4 s* n4 X' }' _1 j" J" G    你是否注意到,在上例中,只要启动make,就会重新编译所有源代码.
( T, D" ~+ y% _5 R# H0 ?    如果你能看懂以下的makefile,恭喜恭喜,你通关了.
3 M$ ]! m+ I$ K% E$ ]8 \[CODE]1 V: }! m; c: Y- W" ~) C
    #一个更为复杂的makefile  O% p. G5 w# S- i# D5 W9 H
    HEADERS=include/myhead.h- T. I" D1 R; Y! V+ [; u
    SOURES=main.c myc.c9 ?6 J- W& R( K; L' ]
    OBJECTS=main.c myc.c
% b7 a* x1 n" m    PRODUCT=$(HOME)/bin/tool9 v2 H6 @9 H& W
    LIB=myrout.a
7 m& q: a* C( x( |    LIBSOURCES=myrout1.c myrout2.c myrout3.c
: M' w- M* k: s& m0 m) m    LIBOBJECTS=$(LIB)(myrout1.o)$(LIB)(myrout2.o)$(LIB)(myrout3.o)& \# W; E& h) |! {1 |7 Q5 S5 Y
    INCLUDE=include
- v# @$ e& U1 R0 v$ Q2 w    CC=cc; g9 |9 H! a$ m4 r& w
    CFLAGS=-g -Xc
# Z& L1 m" s  e4 B8 ]/ `! Z    LINT=lint( x& p( a% i3 X) H6 L8 X- j
    LINTFLAGS=-Xc7 D8 @5 h1 L# ^* p/ {3 w
    all(PRODUCT)+ ]8 U5 F& I5 }* x" q# k
    $(PRODUCT):$(OBJECTS)$(LIB). d; u2 s+ K$ `( ^( {& S7 V# o) ^
        $(CC)(CFLAGS)-o$(PRODUCT)$(OBJECTS)$(LIB)7 D# [0 v& _' p# M" @
    .c.o: $(HEADERS)
0 f/ B4 X; A4 c        $(CC)$(CFLAGS) -c I$(INCLUDE)$<
! b7 t  I! _0 G. Q    $(LIB):$(HEADERS)$(LIBSOURCES)
0 F9 e5 i3 v2 U0 s& m        $(CC)    $(CFLAGS) -c $(?:.o=.c)
8 ^: S- _  R5 F        ar rv $(LIB) $?" z6 u# @% p: n, E( q
        rm $?0 B! ^+ [* y( O5 o
    .c.c:;
$ J: n. i3 H  ^7 a, K# u7 E    lint:    $(PRODUCT)
3 F9 Z/ u, R0 x3 V' k        $(LINT)$(LINIFLAGS)$(SOURCES)$LIBSOURCES)[/CODE]      

TOP

Some discussions:[/SIZE]
. t. ?( i  \# @0 I
# z3 K  }. `( r; N6 d7 w1. Database[/COLOR] 0 U0 R# c0 x! n. O4 U  r" D7 j
4 [: M- N- W" G( r# y( _& t
1). 请教一个关于c++下引用mysql函数的问题/ b2 [' F2 {0 a, C7 r2 A
http://www.linuxeden.com/forum/s ... &threadid=480934 E8 ^; j. {6 C$ m, O9 m
5 Y2 |4 _$ N+ `9 S! C2 [+ s
5 g  s) M. w1 J! r8 o8 Q) Z
2. 进程[/COLOR]
5 I! l) \9 {5 \* w4 A( Y
$ V: h7 r6 A7 D7 O8 w; f6 n4 ^  i1).僵尸进程为何不能消除
/ K& F8 b6 `8 R" H# ohttp://www.linuxeden.com/forum/s ... &threadid=47591! B5 H4 r4 J7 d
3 N1 E3 G  H8 Y, e( T
3. Network[/COLOR] # q( v" t5 q$ R/ u. X

7 I, R9 _& `: A- i$ X1 J8 b2 O& C1)有人知道linux下如何用c获取本机的mac地址吗5 S9 ^, a5 w$ o& A8 c0 U
http://www.linuxeden.com/forum/s ... &threadid=34360      
class faraway : public GNU { public: faraway() : _M_name("faraway"), _M_sex("Male"), _M_age(26) { } ~faraway(); private: std::string _M_name; std::string _M_sex; unsigned long _M_age; };

TOP

Linux resource:
( U) L' |2 m! q
! Z  G- E4 j  H+ _www.tldp.org --many linux HOWTOs
+ G- q2 m+ V0 g$ [3 g0 X% i- ]1 D6 y3 n% `- E
www.linux.org --many linux HOWTOs% Y9 g7 @! c# z4 s5 b/ z
+ R8 E; o! K- k4 u
www.gnu.org --all GNU tools's online manual,such as gcc,gdb...' ^& T1 p2 p- T4 q- b0 Z$ t2 t
www.kernelnewbies.org --many documents about linux kernel for newbie      
class faraway : public GNU { public: faraway() : _M_name("faraway"), _M_sex("Male"), _M_age(26) { } ~faraway(); private: std::string _M_name; std::string _M_sex; unsigned long _M_age; };

TOP

Q:What calls do I use to get the MAC address on a Linux box in a C command line program? (Don't want to parse ifconfig's output)
) Z0 ]9 G  k5 n/ p. zIs there an API call?: u2 I7 X$ |# G5 c$ v+ q  n8 J

# w/ Y& ~0 f, B2 h) E! B; ?A:Here ya go, enjoy!
复制内容到剪贴板
代码:
/*
* gethwaddr.c
* Author: Ben Menking <bmenking@highstream.net>
*
* Demonstrates retrieving hardware address of adapter using ioctl()
*
*
*/
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>

int main( int argc, char *argv[] )
{
        int s;
        struct ifreq buffer;

        s = socket(PF_INET, SOCK_DGRAM, 0);

        memset(&buffer, 0x00, sizeof(buffer));
       
        strcpy(buffer.ifr_name, "eth0");

        ioctl(s, SIOCGIFHWADDR, &buffer);

        close(s);
       
        for( s = 0; s < 6; s++ )
        {
                printf("%.2X ", (unsigned char)buffer.ifr_hwaddr.sa_data[s]);
        }

        printf("\n");

        return 0;
}
      
class faraway : public GNU { public: faraway() : _M_name("faraway"), _M_sex("Male"), _M_age(26) { } ~faraway(); private: std::string _M_name; std::string _M_sex; unsigned long _M_age; };

TOP

Q: How to list/read a director by filter and sort?# |4 N- l: O& I( L, T
1 ?7 a' G& R4 m! f
A: a simple way is use scandir(). more information plz man 3 scandir. Here is a sample demo, it will list all files/directors whithin 3 offset __base_dir:
复制内容到剪贴板
代码:
#include <unistd.h>
#include <dirent.h>

int
alphasort(const void* a, const void* b);

int
select(const struct dirent* __dirent)
{
        int __ret =  strcmp(__dirent->d_name, "20030515");
        return __ret > 0 ? 1 : 0;
}
int
select2(const struct dirent* __dirent)
{
        int __ret = strcmp(__dirent->d_name, "..");
        return __ret > 0 ? 1 : 0;
}

int
main(int __argc, char* __argv[])
{
        struct dirent** __namelist;
        struct dirent** __namelist2;
        struct dirent** __namelist3;
        char                   __base_dir[50];// = "/home/faraway/records/";
        char                __my_dir[50];
        char                __my_dir2[50];
        int __n, __m, __i;
       
        if(__argc < 2)
        {
                printf("USAGE: dir path-name\n");
                exit(1);
        }
        sprintf(__base_dir, "%s", __argv[1]);
        __n = scandir(__base_dir, &__namelist, select, alphasort);
        if(__n < 0)
        {
                perror("scandir");
                exit(1);
        }
        else
        {
                while(__n--)
                {
                        printf("%s\n", __namelist[__n]->d_name);
                        sprintf(__my_dir, "%s/%s", __base_dir, __namelist[__n]->d_name);
                        __m = scandir(__my_dir, &__namelist2, select2, alphasort);
                        if(__m < 0)
                        {
                                perror("scandir");
                        }
                        else
                        {
                                while(__m--)
                                {
                                        printf("        %s\n", __namelist2[__m]->d_name);
                                        sprintf(__my_dir2,"%s/%s",  __my_dir, __namelist2[__m]->d_name);
                                        __i = scandir(__my_dir2, &__namelist3, select2, alphasort);
                                       if(__i > 0)
                                       {
                                                while(__i--)
                                                {
                                                        printf("                %s\n", __namelist3[__i]->d_name);
                                                        free(__namelist3[__i]);
                                                }
                                                free(__namelist3);
                                       }               
                                        free(__namelist2[__m]);
                                }
                                free(__namelist2);
                        }       
                        free(__namelist[__n]);
                }
                free(__namelist);
        }
}
      
class faraway : public GNU { public: faraway() : _M_name("faraway"), _M_sex("Male"), _M_age(26) { } ~faraway(); private: std::string _M_name; std::string _M_sex; unsigned long _M_age; };

TOP

 22 123
发新话题