Linux C文件链接(设备、套接字)/dev/fd/需要避免链接转换的问题

Linux C文件链接(设备、套接字)/dev/fd/需要避免链接转换的问题,c,linux,stat,C,Linux,Stat,我需要一个程序,应该计数文件,找到其中最大的和目录和子目录中的文件总数(分别为子目录) 这是一个多么大的问题:我的程序总是尝试按链接进行,但我不需要这样做! 我试图找到链接和套接字文件,但有些东西不起作用 #include <dirent.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h&g

我需要一个程序,应该计数文件,找到其中最大的和目录和子目录中的文件总数(分别为子目录) 这是一个多么大的问题:我的程序总是尝试按链接进行,但我不需要这样做! 我试图找到链接和套接字文件,但有些东西不起作用

#include <dirent.h>     
#include <errno.h>      
#include <fcntl.h>      
#include <stdio.h>      
#include <stdlib.h>     
#include <string.h>     
#include <sys/stat.h>   
#include <sys/types.h>  
#include <sys/fcntl.h>  
#include <sys/wait.h>   
#include <time.h>       
#include <unistd.h>     
#include <malloc.h>

struct stat st;

struct dirent * d;  
off_t sz[10000];    
FILE *fp;   
char PROG_NAME[100];
char FILE_NAME[100];

char * nm[10000],* maxn;

int rec1(char * rp);

int main (int argc, char *argv[])
{
/*//it's for terminal
    //how much arguments
    if (argc < 3)
    {
    printf("Too few arguments\n");
        return 1;
    };
    if (argc> 3)
    {
        printf("Too many arguments\n");
        return 1;
    };
    FILE * fp; //filepath 
   if ((fp=fopen(argv[2],"w"))==NULL)
   {
      fprintf(stderr,"%s fopen: %s %s\n",argv[0],argv[2],strerror(errno));
      return 1;
   };
   if (fclose(fp)==-1)
   {
      fprintf(stderr,"%s fclose: %s %s\n",argv[0],argv[2],strerror(errno));
      return 1;
   };
   strcpy(PROG_NAME,argv[0]);
   strcpy(FILE_NAME,argv[2]);*/
   strcpy(PROG_NAME,"Prog1");
   strcpy(FILE_NAME,"out.txt");
   char a[100]="/dev/"; //directory where we start  
   if ((fp=fopen(FILE_NAME,"w"))==NULL)     
   {
        fprintf(stderr,"%s fopen: %s %s\n",PROG_NAME,FILE_NAME,strerror(errno));
        return 1;
   };
   rec1(a); 
   if (fclose(fp)==-1)  
   {
        fprintf(stderr,"%s fclose: %s %s\n",PROG_NAME,FILE_NAME,strerror(errno));
        return 1;
   };
   exit(EXIT_SUCCESS);
}

int rec1(char * rp) 
{
   int i=0; 
   off_t sb=0,ts=0;//
   char nb[1000], s[1000];
   DIR * dp;//dirpath
   strcpy(nb,"");//занулим nb
   if ((dp=opendir(rp)) == NULL)
   {
        fprintf(stderr,"%s opendir: %s %s \n",PROG_NAME,rp,strerror(errno));
        return 1;
   };
   while ((d=readdir(dp))!=NULL)
   {
        if (strcmp(d->d_name,".")!= 0 && strcmp(d->d_name,"..")!= 0)
        {
            strcpy(s,realpath(rp,NULL));
            if (s[strlen(s)-1] != '/')
            {
                strcat(s,"/");
            };
            strcat(s,d->d_name);
            stat(s,&st);//вызывает stat
            if (stat(s,&st) != 0)
            {
                printf(" %s :error stat file: %s \n",PROG_NAME, s);
            }
            else
            {
                if (!S_ISDIR(st.st_mode))
                {
                    if (st.st_size>sb)
                    {
                        strcpy(nb,d->d_name);
                        sb=st.st_size;
                    };
                    i++;
                    ts+=st.st_size;
                }
                else//!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                {
                    if (S_ISDIR(st.st_mode)&&(!(S_ISLNK(st.st_mode)))&&(!S_ISSOCK(st.st_mode))
                     &&(!S_ISFIFO(st.st_mode))&&(!S_ISCHR(st.st_mode))&&(!S_ISBLK(st.st_mode)))
                    {
                        rec1(s);
                    };
                };
            };        
        };
   };
   printf("%s %ld %ld %s \n",rp,i,ts,nb);
   fprintf(fp,"%s %ld %ld %s \n",rp,i,ts,nb);
   if (closedir(dp)==-1)
   {
       printf("%s closedir: %s %s \n",PROG_NAME,rp,strerror(errno));
       return 1;
   };
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
结构统计;
结构方向*d;
关东施[10000];
文件*fp;
char PROG_NAME[100];
字符文件名称[100];
字符*nm[10000],*maxn;
int rec1(字符*rp);
int main(int argc,char*argv[])
{
/*//这是去终点站的
//有多少争论
如果(argc<3)
{
printf(“参数太少\n”);
返回1;
};
如果(argc>3)
{
printf(“参数太多”);
返回1;
};
FILE*fp;//文件路径
if((fp=fopen(argv[2],“w”)==NULL)
{
fprintf(标准字符,“%s fopen:%s%s\n”、argv[0]、argv[2]、strerror(errno));
返回1;
};
如果(fclose(fp)=-1)
{
fprintf(标准字符,“%s fclose:%s%s\n”、argv[0]、argv[2]、strerror(errno));
返回1;
};
strcpy(程序名,argv[0]);
strcpy(文件名,argv[2])*/
strcpy(项目名称,“项目1”);
strcpy(文件名,“out.txt”);
char a[100]=“/dev/”;//我们开始的目录
if((fp=fopen(文件名,“w”))==NULL)
{
fprintf(标准字符,“%s fopen:%s%s\n”,程序名,文件名,strerror(errno));
返回1;
};
建议1(a);
如果(fclose(fp)=-1)
{
fprintf(标准字符,“%s fclose:%s%s\n”、程序名、文件名、strerror(errno));
返回1;
};
退出(退出成功);
}
int rec1(字符*rp)
{
int i=0;
off_t sb=0,ts=0//
char nb[1000],s[1000];
DIR*dp;//dirpath
strcpy(nb,“”;//
if((dp=opendir(rp))==NULL)
{
fprintf(stderr,“%s opendir:%s%s\n”,程序名,rp,strerror(errno));
返回1;
};
而((d=readdir(dp))!=NULL)
{
如果(strcmp(d->d_name,“.”)=0和&strcmp(d->d_name,“…”)!=0)
{
strcpy(s,realpath(rp,NULL));
如果(s[strlen(s)-1]!='/'))
{
strcat(s,“/”);
};
strcat(s,d->d_名称);
统计数据;统计数据
如果(统计和统计)!=0
{
printf(“%s:错误统计文件:%s\n”,程序名,s);
}
其他的
{
如果(!S_ISDIR(st.st_模式))
{
如果(st.st_尺寸>sb)
{
strcpy(nb,d->d_名称);
sb=标准尺寸;
};
i++;
ts+=st.st\U尺寸;
}
其他//!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
如果(S_ISDIR(st.st_模式)和(!(S_ISLNK(st.st_模式))&(!S_ISSOCK(st.st_模式))
&&(!S_-ISFIFO(st.st_模式))&&(!S_-ISCHR(st.st_模式))&&(!S_-ISBLK(st.st_模式)))
{
建议1(s);
};
};
};        
};
};
printf(“%s%ld%ld%s\n”,rp,i,ts,nb);
fprintf(fp,“%s%ld%ld%s\n”,rp,i,ts,nb);
if(closedir(dp)=-1)
{
printf(“%s closedir:%s%s\n”,程序名,rp,strerror(errno));
返回1;
};
}
` 当脚本找到预目录的链接文件时,它会循环。 试图避免链接转换,但失败。 尝试定义/dev/fd/4…/dev/fd/23文件,但始终出现错误“无此类文件或目录”

#包括
#包括
#包括
#包括
#包括
int
main(int argc,char*argv[])
{
结构统计某人;
如果(argc!=2){
fprintf(stderr,“用法:%s\n”,argv[0]);
退出(退出失败);
}
if(stat(argv[1],&sb)=-1){
佩罗(“stat”);
退出(退出失败);
}
printf(“文件类型:”);
开关(sb.st\U模式和S\U IFMT){
案例S_IFBLK:printf(“块设备”);中断;
案例S_IFCHR:printf(“字符设备”);中断;
案例S_IFDIR:printf(“目录”);break;
案例S_IFFO:printf(“FIFO/管道”);中断;
案例S_iFlink:printf(“符号链接”);中断;
案例S_IFREG:printf(“常规文件”);中断;
案例S_IFSOCK:printf(“套接字”);中断;
默认值:printf(“未知?\n”);中断;
}
printf(“I节点编号:%ld\n”,(长)sb.st_ino);
printf(“模式:%lo(八进制)\n”,
(无符号长)sb.st_模式);
printf(“链接计数:%ld\n”,(长)sb.st\n链接);
printf(“所有权:UID=%ld GID=%ld\n”,
(长)某人圣路易斯,(长)某人圣吉德);
printf(“首选I/O块大小:%ld字节\n”,
(long)sb.st_blksize);
printf(“文件大小:%lld字节\n”,
(长)sb.st_尺寸);
printf(“分配的块:%lld\n”,
(长)sb.st_blocks);;
printf(“上次状态更改:%s”,ctime(&sb.st_-ctime));
printf(“上次文件访问:%s”,ctime(&sb.st_atime));
printf(“上次文件修改:%s”,ctime(&sb.st_mtime));
退出(退出成功);
}
请帮助我

当您应该使用
lstat()
时,您正在使用
stat()
。从:

lstat()与stat()相同,只是如果路径是符号链接,则链接本身是stat-ed,而不是fil
#include <sys/types.h>
       #include <sys/stat.h>
       #include <time.h>
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(int argc, char *argv[])
       {
           struct stat sb;

           if (argc != 2) {
               fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           if (stat(argv[1], &sb) == -1) {
               perror("stat");
               exit(EXIT_FAILURE);
           }

           printf("File type:                ");

           switch (sb.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;
           }

           printf("I-node number:            %ld\n", (long) sb.st_ino);

           printf("Mode:                     %lo (octal)\n",
                   (unsigned long) sb.st_mode);

           printf("Link count:               %ld\n", (long) sb.st_nlink);
           printf("Ownership:                UID=%ld   GID=%ld\n",
                   (long) sb.st_uid, (long) sb.st_gid);

           printf("Preferred I/O block size: %ld bytes\n",
                   (long) sb.st_blksize);
           printf("File size:                %lld bytes\n",
                   (long long) sb.st_size);
           printf("Blocks allocated:         %lld\n",
                   (long long) sb.st_blocks);

           printf("Last status change:       %s", ctime(&sb.st_ctime));
           printf("Last file access:         %s", ctime(&sb.st_atime));
           printf("Last file modification:   %s", ctime(&sb.st_mtime));

           exit(EXIT_SUCCESS);
       }
$ time sudo du --exclude /sys -xslLc /*
3           /bbs
10028       /bin
166960      /boot
0           /bulk
288         /dev
246068      /etc
100521273   /home
4           /home2
11588       /initrd.img
11612       /initrd.img.old
1789892     /lib
16          /lost+found
12          /media
12          /mnt
3           /net
747204      /opt
7245712     /proc
1035364     /root
38312       /sbin
4           /selinux
4           /srv
4           /tanq
37432       /tmp
14636048    /usr
1476612     /var
4328        /vmlinuz
4196        /vmlinuz.old
127982979   total

real    0m53.157s
user    0m20.773s
sys 0m21.137s