22 123
发新话题
打印

编程开发版精华FAQ

? 在RH7.1下安装Kylix会有error -10的错误,问题可能是出在RPM 4.0.2-8上。 $ }  b+ S" }3 C8 N
! 我发现可以有两个方法解决: % D! E$ ~6 @$ b# ~
  1、ftp://ftp.rpm.org/pub/rpm/test-4.0.3/下载rpm 4.0.3+ / ~' i6 x9 u0 j7 q5 D( g+ `
  2、比较简单,只要避开root自动运行rpm的步骤就行了,
2 a# b1 ]* Y7 P" _/ ~7 S0 A$ a     sh setup.sh -m 安装即可
* a+ M$ Z' R. a+ X, e  T) q/ C
# U% H7 r1 v) l* {9 T1 @- Y- P? 我下载了kylixft4.iso文件(600多M),用IOSBUSTERRS打开刻盘后,安装时老告诉我glibc版本不够高。我升级glibc到2.1.3或者是2.2 但他还是检测glibc到版本不够高。请问是怎么回事。有什么办法解决吗?
( }! P6 G! i/ _# n' ]7 g1 I! 你安装Red Hat7.1, 再创建一个用户, 然后以这个用户登录linux(非root就行), 再安装kylix, 定不会再有问题!!!OK!!!
3 i# d' z; q7 h2 V7 _" ?7 H# d
? 请编程高手指教
* x  A. N0 A% X我在学unix进程间通信----SYSTEM V消息队列的时候遇到如下问题
5 N& m8 k, N6 ^$ O& K# P9 v[root@localhost svmsg]# make , ?" f& H  ~8 k2 R) @) U# i
gcc -g -O2 -D_REENTRANT -Wall -c -o ctl.o ctl.c : ]# {$ m0 {' s$ g# b

$ G( C% H+ x" k. Fctl.c: In function `main': & V, T1 H; |' z& \# k: p& ~' u
ctl.c:8: storage size of `buf' isn't known 7 x2 b- F0 P" H- P! ~& J' X
ctl.c:10: `MSG_R' undeclared (first use in this function)
( w& m6 e; Y6 ~8 E  E$ ]6 {. Jctl.c:10: (Each undeclared identifier is reported only once & I0 m! Z2 ]' G6 N% L
ctl.c:10: for each function it appears in.) . T" f8 m6 B5 X# U
ctl.c:10: `MSG_W' undeclared (first use in this function)
% E- D: B' n+ u8 {- N2 jctl.c:18: `ulong_t' undeclared (first use in this function) % g, N( {: T) _2 S  `/ ?) x; o' i
1 T$ u# ]7 k) A/ s6 {$ V' T

4 W& r9 T  @: [$ J. V! x下面是ctl.c文件 3 O0 S3 V3 K3 p# s
#include "unpipc.h" & M8 h+ u1 H/ \0 @0 e1 I# u1 m

: [. Q- h) f& R/ Pint 3 Z9 k5 y! ?3 A, A) f3 y" U6 x
main(int argc, char **argv) 7 h* Q* K* M* H0 x. a! _, l3 N
{ & h9 w# P0 X$ P* x- D' d6 t( P0 O% d9 `5 N
int msqid;
: H3 e- i  J; d3 D6 vstruct msqid_ds info;
2 B' L( S% H7 Wstruct msgbuf buf;/*问题所在处*/ + ^0 o* _6 l+ V; j. V" w6 L
/ m4 C% t9 J$ \- g5 r
msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);/*问题所在处*/ & G. \3 {% w' z* [5 T- _

7 m! K* e4 E( h2 f7 ]* H. Y# A* E* J# l
/*other code*/
9 N! f# H/ X6 H8 }/ w' {4 X$ i}
7 I$ T! I' b1 R+ S6 o
! |- R2 U6 l0 K* F. x/ R" ^9 o' I
9 S! i) y" G0 E+ S+ R; B+ o下面是unpipc.h文件节选
) B4 V) X4 Y4 R3 ?#ifdef HAVE_SYS_MSG_H # w+ v: D, F2 r/ @+ n
# include <sys/msg.h> /* System V message queues */
2 ]$ q% \4 w! s5 s8 |  j& {#endif $ r! x9 i4 t8 T4 S
& P" n& e* M0 b9 b+ t

5 l5 K& ^. h4 @+ d0 n' c4 ^#define SVMSG_MODE (MSG_R | MSG_W | MSG_R>>3 | MSG_R>>6)/*问题所在处*/   c4 s0 x8 o, p+ H6 {3 G
/* default permissions for new SV message queues */
& Y5 d- V1 y- f- n, Y' n/* $$.ix [SVMSG_MODE]~constant,~definition~of$$ */ - u6 m7 K/ i6 a6 S- H4 ~8 c

0 @( ]8 {& }7 J1 @6 t: E& Y" t) a& s
下面是<sys/msg.h>文件
' h' i& ?( {6 z: @# i#ifdef __USE_GNU $ ?2 v2 e' N) s3 y7 b6 |4 l
/* Template for struct to be used as argument for `msgsnd' and `msgrcv'. */
5 Z3 x. n, M: N" k) Bstruct msgbuf * r4 J  e. ]8 T8 X0 V+ S
{
6 s0 L; S" X/ @7 n0 rlong int mtype; /* type of received/sent message */   s- E7 t" C% e) U/ d* L( G! a
char mtext[1]; /* text of the message */
  Z; P6 `& Q  ^' p& d* C; t3 G};
0 o' V8 L0 l4 c! O. y8 w5 T% l#endif & p; {: @- ^9 o! ^
* w# ?- w7 ?" A# m: }( p
请各大虾多多指教!!(我用的是linux7.0) 8 ]- Y* |& i. i

5 f2 J4 P, U2 e3 h4 G! 可以用O_RDWD 替换程序中的MSG_R||MSG_W(具体含义说明请参照<sys/fcntl.>说明; - @1 w5 W$ I# q  W) v. ?) [
用ulong 替换程序中的ulong_t(或在<sys/types.h>增加ulong_t的说明.
2 B: p/ [- b  E, b
/ I/ y* o: _  p- ~6 |" F) c8 u; L, d. r. Y
? 我试着用gcc写一个父子进程:
+ K* v' {- ?4 y8 cif (fork()==0)
& N; A& L6 ^0 q$ D& M{ while (1) + @. u1 @+ M* o5 }
{ printf("A "); ' m& C( G5 q; Z9 p! k
sleep(1);
$ I( y7 m2 r- z' i! t} ) v  V9 y, Q( D4 n* H" n9 U/ q
}else " y( o: G( s1 h
while (1) ) [/ Q# W  h2 P4 q) j! Z+ f
{ printf("B ");
$ L& y2 J" r8 S; v& c1 J, Hsleep(1); 2 [* \6 |. G# S0 R6 G8 q
} 2 A( K: m+ v( Y% |+ h1 T
}
! b4 @+ O0 k9 e' z, e, c. V7 k可是不能打印A、B。注释掉sleep,可以打印 0 J  n- b' G8 `2 w: I
请教各位何解? % N* e( P: @- b1 x/ v

) m, j3 o1 o0 q" [+ O! 你加上\r\n看看!0 O6 P( Z3 \# {3 A) e) u# z5 _
1 X+ L% b, `" d% K# H( w9 T
! that can not make sure that two process run simultaneously. " c) n- L. }) ]$ Q
you should use signal to communicate between parent and child process to work cooperately. ! c$ Y6 ~* ?, `9 v0 _
man 3 getppid
3 ^% k' J+ l, O6 J- _* C/ Iman 3 kill
7 {, o  j( V2 t  `0 i' Mman 3 signal& s7 Q, V# F- j: s% n; k
9 y6 F+ F  V& g+ w; C4 f0 Q% a3 ]* A
[已被 DarkSpy 编辑过, 在 2001-09-20  08:21]      
-----------------------------------------
http://www.darkspy.org/blog

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

TOP

(回应)

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

TOP

编程问题FAQ

Q: 为什么我用 gcc 编译出来的 a.out 不能执行?
7 @- O6 Y: P7 `9 I7 L& R我编辑了一个 test.c 并用 gcc 编译, 生成一个 a.out 文件
1 E9 Q0 T  h# i但是为什么它不能执行? % z6 S1 ?+ T# X3 R2 p& X: L
% ^1 r" [# {/ _5 z  U) Q
A: 在 Linux 下执行程序需要指定文件路径。 请试试 ./a.out
( H. X& ^$ B0 ?- d/ f. A) n这里用 ./ 告诉 shell 要执行的程序在当前目录。 ) q3 r8 U; f0 O$ V! d( H$ l2 y" }
当然如果环境变量 PATH 中包含了路径, 则可以不用这样指定。
6 m7 X1 C& u" ]可以通过设置用户配置文件改变它。 " v4 V' C) U# a4 ]1 V$ ?3 y  O
如果是bsh, ksh, bash: ( y7 O" D1 o* g3 B' q
vi ~/.bashrc
7 {& z6 z( ~) U% D" a添加一行: & F. k: Q' F# n3 n) R
PATH=$PATH:.
# `1 r& D" _9 ?2 }9 M( e如果是csh, tcsh: , f% k4 s* ?! {/ _: R
vi ~/.cshrc
1 Q  K5 d, J5 K* }' ?: j4 U/ V添加一行: ; \: `" T. `3 q* s/ H  s! w
setenv PATH $PATH:. 5 |2 G$ y9 V& d+ `( N& ^
这样下次等录就可以直接执行当前目录的程序了。 9 X; o& O& V) {7 f
4 G- j  {3 N8 ^# m, X: l1 p- G' a
Q: 编程问题: 如何在 Linux 中得到特殊键的扫描码? 3 @: ^9 v$ [5 [9 D: q0 _8 B$ H
在 DOS 下面可以通过 INT86 函数进行系统调用来得到方向键的码。 ; u6 w$ Z# W+ T+ N$ N! V( k8 Q
但是在 UNIX 下用 GCC 的什么函数可以读入方向键,
# `+ w% o0 x' F4 z4 E/ [5 y! ~" T又是用什么函数来输出一个方向键呢?
. p+ f3 |/ _$ W8 q; }9 \
5 c9 |$ y1 z7 f2 y5 B$ sA: A: there is structure kbentry defined in /usr/include/linux/kd.h ; _! A8 g/ x) g. c: o! ?

5 c" @) ?, F1 A. c5 v% fand,u can find definitions of the structure’s members in # I2 I. ?& m- p! O% H

, L0 S. f. z/ ?0 J8 z/usr/include/linux/keyboard.h,
3 m' e3 ]5 Z; P
, h/ W& i7 v6 _7 t, Xthen use ioctl() to set the keymap,and read() to read the ' r; Q" H3 @1 Y" a+ h9 T

, F8 G% i3 v0 Qvalue retured when a key being pressed.
; v0 T: e& Z6 m8 `
! ^+ q. P/ y8 u& H  kQ: 编程问题: 关于文件结束的判断偶要对一个log文件进行分析,通过下面的方法打开 , G1 _7 n/ Q- }
if ((fp=fopen(free,"r+"))==NULL){ //the free ip file created by manual printf("can’t open file %s.",free); 6 `" v% |- ]3 w
putchar(’\n’); . x! l9 N6 a1 [8 \. h4 L
exit(0);
+ K8 X: m8 h- b}
, n) t5 V" t+ ?6 ?; [/ o' T7 d通过fgets函数从fp流中取出字符串验证,正确!
$ v- G2 g- Y$ m# x/ S" L但当偶用while(fgetc(fp)!=EOF){}进行提取分析时,却发生
9 G( V8 Z' d. ~# g5 u"Segmentation fault"错误!
  D7 }2 l; N  z3 q$ |0 x+ d. [0 l% y呜呼!为什么?????
) ^9 F; v2 k, E: D' e8 T
7 N" o; @0 l/ Y  ]# aA: "Segmentation fault"错误!
& e) Z# O* V7 l~~~~~~~~~~~~~~~~~~~ 这种错误是因为指针为空。
: I. ^" Q& C% L  O" Y9 O而且用EOF作为文件结束的标志不太好,可能文件结束了还是!=EOF。
( J7 X9 m* ?1 T  k, e. v
/ q3 h4 x* K5 e" C7 Y3 J  CTry to use:
5 r6 o) y- A/ y/ t- \* f5 \8 Y# dwhile(!feof(fp)) {
' p  `4 p6 f4 u% v: Tfgetc(fp);
+ ]* S) n# x+ \, G( I} ) J8 Z% ~: W" U. |
试试看。      

TOP

Q: gcc -o hello hello.c之后,在用gdb进行调试时,用list或break为何不行?* I3 E1 ]! A6 D; q& c: \* Q
3 c$ E2 ]) N' s1 v4 p' t
A: 在编译的时候加-g选项,如:gcc -o hello -g hello.c.0 a& z/ F1 m4 B6 l3 S* K+ ?

  C  p  U0 \4 W& v5 {, s( AQ: 如何跟踪子进程?
2 t2 J  `; `3 S3 L7 y* u- |5 G$ ?7 z$ L* G
A: 可在子进程中设置sleep,然后可用attach pid对子进程进行跟踪。多个子进程则可多开几个gdb分别attach然后跟踪., W8 z( @; L. t
7 L8 V. \* k* P: Z1 K5 R) T
更多的关于gcc和gdb的使用方法可到www.gnu.org( V/ f3 q, v6 R0 E
的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++开发工具?
" b, w2 {" H0 V  ]& V, O' n% o1 U
A: 比较经典的编辑工具有vi、emacs等,她们有命令行版和图形版。编译工具有gcc,调试工具有gdb.这些工具一般都会预装。
+ P8 r; W. n5 I6 @   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简单介绍
7 e- V4 k, H( W# g( r& H[]什么是make?
7 g' s! k7 g& u: A# j! w- @2 e0 _  D. V; ~( o0 }
    Unix(Linux)是一个天生的开发平台,make是一个强力的工具.它能  j' [1 c; d% r  c+ G) w
自动跟踪相互依赖的源代码块并组成一程序,使得很容易建立一可执行程序.Make就是这种有依赖关系的部分和代码之间所作的规格说明.
4 g. R5 Z4 E, b% Q8 s6 {9 j" g& p5 @4 j6 V3 k% V0 X- j. Z
[] 所有的程序都要使用make?
1 W) l! O2 r1 |$ x; m9 _$ F    是的.尽管你只有几个简单的模块,但你需要有一种结构来支持它从简单走向复杂.除非你的程序已经盖棺定论.6 t) R. t8 T6 W' r: @! o

/ b- A: i6 P. A1 t[]Makefile由哪些组成?
1 O' ?( C  @# y8 x+ c$ o    Makefile由以下几个部分组成:
- X" ?; N4 j: }- e0 W
8 s8 ~6 y) E) j$ c$ h5 g# j    注释.
' b) o' X9 Q( r) C1 L. `& m    ^^^^
& _$ `! h# ?) O    使用#符号插入.make将忽略#之后的任何内容以及其后的RETURN键.
3 K: c# ^5 n. v  T/ {
* l7 F3 {" K. t& p, m( W  _* o    变量.3 O4 J6 o6 {  g; M. w
    ^^^^
. B  B( O) r- q. v    make允许定义与SHELL变量类似的有名变量.比如,你定义了SOURCES=prog.c,那么该3 Q7 w! U& Y# W) K- i& F
变量的值$(SCOURES)就包含了源文件名.
; Z" b) K) b& `# H( @4 {# c8 Q3 Z4 T1 I# ]2 \
    依赖关系.
2 s0 @% x; u' [+ F    ^^^^^^^^
4 ?- {' S9 {8 {& U. M    左边是目标模块,后接一冒号.再接与该模块有依赖关系的模块.1 }4 L3 O" l' @  X2 A

3 R% n0 @! {# Z  j9 @, r    命令.   
8 o0 u, W- I  T, S% A" F9 D* p    ^^^^5 I2 d- x& N4 H& t
    以TAB键开始(即使用相同数量的空格也不能代替它).
" s, C- O# Y$ i# v7 k7 x: s# c5 Q+ e; b9 g! z
9 u+ o# l; v: F! U4 f& G
[]Makefile示例/ e( [0 U" l2 Q& V4 b2 R( x0 F
    下面介绍一个简单的示例来说明make的用法.假设你的程序有两个源文件main.c和my! x  k) ?- J4 x8 _6 y
c.c,一个位於子目录include下的头文件myhead.h,一个库由三个源文件myrout1.c,myrou1 Y3 J9 Y: Z5 g
t2.c,myrout3.c产生.
& I3 g0 `" L. I* i  n4 T    其makefile文件为:+ s3 t" s2 Y5 B8 ?' ?
[CODE]# F& j- A6 v# m4 n2 N- f% e
    #一个基本的MAKEFILE文件.+ A, E! V( |( r# H8 k0 I
    #其中包括个人的头文件和个人库.' C+ B# i  [( u$ ?/ F
    HEADERS=include/myhead.h& Y- `9 B  p- s. L  T/ m
    SOURCES=main.c myc.c/ N* Y0 W: D8 R9 M
    PRODUCT=$(HOME)/bin/tool/ ]0 f3 z! k) Q" t
    LIB=myrout.a7 l4 Y  L; l) h2 o) D! u
    LIBSOURES=myrout1.c myrout2.c myrout3.c+ u; \1 o$ P9 J1 y; q% `" |
    CC=cc
6 S4 I/ t0 Z; j/ u3 W    CFLAGS=-g6 p4 p- s( K; X; R; D
    all(PRODUCT)
. |# p+ J+ ?7 n# Q  c$ Q    $(PRODUCT)(SOURCES)
# y; N6 d8 p1 q        $(CC)$(CFLAGS) -o $(PRODUCT)$(SOURCES). Y2 z- l9 g* R# _; e
    lint(PRODUCT)* w" G, K" }$ r4 T% B2 m6 B
        lint $(SOURCES)$(LIBSOURCES)[/CODE]
  q0 x! b6 ~& r    哈哈,挺象SHELL编程的.如果你与我一样使用LINUX下的gcc,那么只要把上面的CC=cc改为CC=gcc即可.怎么样,想来一个更复杂点的吗?
# v1 x/ H/ Q- T0 E3 h0 n2 ^( H7 M9 L9 i$ M$ N& @; E" \
[]一个更为复杂的Makefile# b) d4 _3 S+ r$ P
    你是否注意到,在上例中,只要启动make,就会重新编译所有源代码.
5 ~7 F  C* Y- L8 _/ l' u' ^    如果你能看懂以下的makefile,恭喜恭喜,你通关了.) ?$ h% S& E! ]4 C, L( i5 G
[CODE]! N4 w! v9 {8 f5 `
    #一个更为复杂的makefile
0 U1 {- _3 A/ K% ~) z* h    HEADERS=include/myhead.h
5 o7 g/ x1 C/ p+ J: K4 c2 ^* t4 ^. L    SOURES=main.c myc.c" ^7 Z9 T; n( j, l! b3 o
    OBJECTS=main.c myc.c2 M$ p# C' d1 y* ^1 [) b
    PRODUCT=$(HOME)/bin/tool
# ~0 t% E# l5 S; A    LIB=myrout.a+ i+ [; v' v! U' f/ f/ s
    LIBSOURCES=myrout1.c myrout2.c myrout3.c
+ {/ {1 H, f4 T    LIBOBJECTS=$(LIB)(myrout1.o)$(LIB)(myrout2.o)$(LIB)(myrout3.o)2 l  f/ [% z8 S# E5 O2 [5 s: N
    INCLUDE=include- y7 ^2 W1 U' g1 I) c. N
    CC=cc# w6 F' v' Z1 T0 z+ u' W- _
    CFLAGS=-g -Xc( G: B! ]' `- q# |# `) S! H# p/ U
    LINT=lint
$ ]5 K' [% U. `# ]* p    LINTFLAGS=-Xc. O" Z2 D  Y0 U8 t2 B
    all(PRODUCT)
% ?2 z+ z/ q  Y$ Q5 J    $(PRODUCT):$(OBJECTS)$(LIB): z0 C- Z6 @) ]/ _) U
        $(CC)(CFLAGS)-o$(PRODUCT)$(OBJECTS)$(LIB)' `0 b0 t3 x, n7 U- T4 X$ }3 N& Y
    .c.o: $(HEADERS)4 X$ K- a* c; j6 i2 b' K
        $(CC)$(CFLAGS) -c I$(INCLUDE)$<
0 ^( c" t3 W4 u7 F2 [6 H    $(LIB):$(HEADERS)$(LIBSOURCES)  q- b7 H' [0 Q' Q. w; X
        $(CC)    $(CFLAGS) -c $(?:.o=.c)- P; i. D7 A8 F( Q9 w5 ^: T
        ar rv $(LIB) $?
. l7 m4 Z8 S1 i( ], G- C        rm $?6 u3 N2 {* r1 c' N# `' g
    .c.c:;
: f4 Z, d6 d* f* {    lint:    $(PRODUCT)
8 U/ E7 t" e: o5 q, [# \        $(LINT)$(LINIFLAGS)$(SOURCES)$LIBSOURCES)[/CODE]      

TOP

Some discussions:[/SIZE] 1 s* C+ f/ z& z% p4 C
$ q7 f9 @0 T- M8 d% O
1. Database[/COLOR] ! r) P" h* s! }6 n2 Q9 I# l, O  I8 @

, }5 ]! _4 G' ~0 l: `; x- j3 T1). 请教一个关于c++下引用mysql函数的问题
2 R9 W' U4 {6 z) w5 g# L! x: |) Ihttp://www.linuxeden.com/forum/s ... &threadid=48093' p1 b8 b5 O+ v8 M/ q, w- \
9 [' E8 n% U3 \( e* q/ a
( G$ C  o4 d. B
2. 进程[/COLOR]
. d$ v1 X) ?# M4 ^) k
& _  V/ f& V+ }2 x( I) E  X1).僵尸进程为何不能消除
& g2 [& e8 E, |/ G4 k: [http://www.linuxeden.com/forum/s ... &threadid=475919 D6 `8 q3 s$ `- s
7 Q7 A7 I9 j) ^. u" V+ r
3. Network[/COLOR] ! D$ s9 `* C3 D
1 z3 h# K% e$ {& _, F( W; Z4 R2 |
1)有人知道linux下如何用c获取本机的mac地址吗
+ j: ?, b: C1 S" e# j  fhttp://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:
- Y, V4 f7 F/ A( N/ F3 G- e+ o! S0 r4 _, C2 N
www.tldp.org --many linux HOWTOs
1 H9 R, {4 v/ j$ Y3 W1 P( D$ `$ F/ m* J& F
www.linux.org --many linux HOWTOs1 E: r3 m0 w% h4 H' q
2 J5 C, e; |2 K
www.gnu.org --all GNU tools's online manual,such as gcc,gdb...
4 z5 q  s, u* z9 Qwww.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)
0 |# ~0 m; h! r, vIs there an API call?
% H- h- \1 e, \: k; u# S7 [
; _1 @. ~6 h) kA: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?- @9 x  e+ ^; h8 J9 U/ u
( v9 C# l) E5 l* s) F7 Y, O
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
发新话题