2010-10-21 19 views
7

मेरे पास नीचे कोड है इसका एक हिस्सा यहां दिखाया गया है और मैं जांच रहा हूं कि फ़ाइल का प्रकार क्या है।कोई फ़ाइल लिंक होने पर कैसे पता लगाना है?

struct stat *buf /* just to show the type buf is*/ 

switch (buf.st_mode & S_IFMT) { 
    case S_IFBLK: printf(" block device\n");   break; 
    case S_IFCHR: printf(" character device\n");  break; 
    case S_IFDIR: printf(" directory\n");    break; 
    case S_IFIFO: printf(" FIFO/pipe\n");    break; 
    case S_IFLNK: printf(" symlink\n");     break; 
    case S_IFREG: printf(" regular file\n");   break; 
    case S_IFSOCK: printf(" socket\n");     break; 
    default:  printf(" unknown?\n");    break; 
} 

समस्या: st_mode प्राप्त का मूल्य जब मैं एक printf("\nMode: %d\n",buf.st_mode); कर परिणाम 33188.

मैं एक नियमित फ़ाइल प्रकार और एक प्रतीकात्मक लिंक के साथ मेरे कार्यक्रम का परीक्षण किया है। दोनों मामलों में आउटपुट "नियमित फाइल" था यानी प्रतीकात्मक लिंक केस असफल रहा है और मैं समझने में असफल क्यों हूं?

+0

प्रश्न थोड़ा अस्पष्ट है। क्या आप एक प्रतीकात्मक लिंक का परीक्षण कर रहे हैं, और कार्यक्रम कहता है कि यह एक नियमित फाइल है? Buf.st_mode का मूल्य क्या है? –

+0

@ गिंटौटास: संपादित। –

+4

आपको 'lstat()' की आवश्यकता है। 'stat()' प्रतीकात्मक लिंक का पालन करता है और वे जिन फ़ाइलों को इंगित करता है उन्हें जांचता है। –

उत्तर

14

stat (2) आदमी पृष्ठ से:

stat() आँकड़े फ़ाइल पथ द्वारा की ओर इशारा किया और buf में भरता है।

lstat()stat() के समान है, सिवाय इसके कि यदि पथ एक प्रतीकात्मक लिंक है, तो लिंक स्वयं स्टेट-एड है, न कि वह फ़ाइल जिसे संदर्भित करता है।

दूसरे शब्दों में, stat कॉल लक्ष्य फाइल करने के लिए सांकेतिक लिंक का पालन करें और कि की जानकारी प्राप्त नहीं होगा। इसके बजाय lstat का उपयोग करने का प्रयास करें, यह आपको लिंक के लिए जानकारी देगा।


यदि आप निम्न कार्य करें:

touch junkfile 
ln -s junkfile junklink 

तो संकलन और निम्नलिखित कार्यक्रम चलाने:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

int main (void) { 
    struct stat buf; 
    int x; 

    x = stat ("junklink", &buf); 
    if (S_ISLNK(buf.st_mode)) printf (" stat says link\n"); 
    if (S_ISREG(buf.st_mode)) printf (" stat says file\n"); 

    x = lstat ("junklink", &buf); 
    if (S_ISLNK(buf.st_mode)) printf ("lstat says link\n"); 
    if (S_ISREG(buf.st_mode)) printf ("lstat says file\n"); 

    return 0; 
} 

आप मिल जाएगा:

stat says file 
lstat says link 

अपेक्षा के अनुरूप।