¦b Linux ¤U«Ø¥ß³nÅé®M¥ó : ²Ä¤T­Ó¨Ò¤l: Fortune
Previous: ²Ä¤G­Ó¨Ò¤l: Xloadimage
Next: ­þùØ¥i§ä¨ì­ì©l½XÀÉ®×

8. ²Ä¤T­Ó¨Ò¤l: Fortune

³Ì«á¨Ò¤l»Ý­n¬Y¨Ç C µ{¦¡³]­pª¾ÃÑ. ¤j³¡¤Àªº Linux ³nÅé¬O¥Î C ¼gªº, ¦Ó¥B¦Ü¤Ö¾ÇÂI C ©úÅ㪺¹ï¥ô¦ó·Q³nÅé¦w¸Ëªº¤H·|¦³§U¯q.

´c¦W¬L¹üªº(notorious) fortune µ{¦¡¦b¨C¦¸ Linux ¶}¾÷°_¨Ó®É¨q¥X«ÕÀqªº¿Î»y "fortune cookie". ¤£©¯¦a (¦³ÂùÃö·N«äªº), ³]ªk¦b Red Hat µo¦æ®M¥ó 2.0.30 ªº®Ö¤ß¤U«Ø¥ß,¥X²{¤F ¤@°ïÄY­«ªº¿ù»~.


~/fortune# make all


gcc -O2 -Wall -fomit-frame-pointer -pipe   -c fortune.c -o
fortune.o
fortune.c: In function `add_dir':
fortune.c:551: structure has no member named `d_namlen'
fortune.c:553: structure has no member named `d_namlen'
make[1]: *** [fortune.o] Error 1
make[1]: Leaving directory `/home/thegrendel/for/fortune/fortune'
make: *** [fortune-bin] Error 2

¬Ý¤@¤U fortune.c, ¦³ÃöÁpªº´X¦æ¦b³o.


   if (dirent->d_namlen == 0)
            continue;
        name = copy(dirent->d_name, dirent->d_namlen);

§Ú­Ì»Ý­n§ä¥X dirent ªº structure, ¦ý¥¦¨S¦³«Å§i(declared)¦b fortune.c Àɮפ¤, ·Q¥Î grep dirent ¨Ó¨q¥X¬O§_¦b¨ä¥¦­ì©l½XªºÀɮפ¤, ¦ý¤]¨S¦³. µM¦Ó, ¦b fortune.c Àɪº³Ì¤W¤è¦³¤U¦C³o¦æ.


#include <dirent.h>

³o¦ü¥G¬O¨t²Î¨ç¦¡®wªº include ÀÉ®×, ©Ò¥H­n§ä dirent.h ªº¦X²z¦ì¸m¬O¦b /usr/include. ¨Æ¹ê¤W, dirent.h ªº½T¦³¦b /usr/include ¤¤, ¦ý¸ÓÀɨS¦³¥]§t dirent ªº structure. µM¦Ó, °Ñ¦Ò¥t¤@­Ó dirent.h ÀÉ.


#include <linux/dirent.h>

³Ì«á, ¥h /usr/include/linux/dirent.h, §Ú­Ì¥i§ä¨ì§Ú­Ì©Ò»Ý­n«Å§iªº structure.


struct dirent {
        long            d_ino;
        __kernel_off_t  d_off;
        unsigned short  d_reclen;
        char            d_name[256]; /* We must not include
limits.h! */
};

¨¬°÷¦a½T©w, ³o­Ó structure «Å§i¨S¦³¥]§t d_namelen, ¦ý¦³¤@¹ï»P¨ä¬Û·íªº¿ï¾Ü. ¨ä¤¤³Ì¥i¯àªº¬O d_reclen, ¦]¬° ³o­Ó structure member ªí¥Ü¬Y¼ËªF¦èªº length ¦Ó¥B¥¦¬O short integer. ¨ä¥L¤j²¤, d_ino, ¥i¯à¬O inode number, §PÂ_¥¦ªº name ©M type. ¨Æ¹ê¤W, §Ú­Ì¤j·§¬O³B²z "directory entry" structure, ¦Ó¤¸¯Àªí¥ÜÀÉ®×ÄÝ©Ê, ¥¦ªº¦WºÙ, inode, ©M length (¥H blocks §@³æ¦ì). ³o¦ü¥G¹ï§Ú­Ìªº²q·Q«Ü¦X²z.

§Ú­Ì½s¿èÀÉ®× fortune.c, ¦Ó¥B§ïÅܦb551¦æ©M553¦æªº d_namelen Åܦ¨ d_reclen. ¦A¸Õ¸Õ make all. Success. ³o¦¸«Ø¥ß¨S¦³¿ù»~. §Ú­Ì²{¦b¯à°÷±q fortune Àò±o "cheap thrills"


¦b Linux ¤U«Ø¥ß³nÅé®M¥ó : ²Ä¤T­Ó¨Ò¤l: Fortune
Previous: ²Ä¤G­Ó¨Ò¤l: Xloadimage
Next: ­þùØ¥i§ä¨ì­ì©l½XÀÉ®×