• 締切済み

実行ファイルの識別方法?

自分で何度か試したのですが、うまくいきません。ご存知の方ご教授ください。 ディレクトリを指定してその配下にあるファイル全てを実行ファイルか、シンポリックファイルか、普通?のファイルか判断しようとしましたがどうしても実行ファイルの判断処理でコンパイルエラーになります。 (lstatの使い方がちゃんとわかってない?) だいたい以下のような流れです。 ----------------- DIR *dirp; struct dirent *file; /*ここで指定ディレクトリのオープン処理(省略)*/ while((file = readdir(dirp)) != NULL) { char buff[65536]; struct stat buffer; sprintf(buff,"%s%s",dir_name,f->d_name); // 注)dir_nameは指定されたディレクトリ lstat(buff,&buffer); printf( "FILE[%s]\n",f->d_name); if( S_ISLNK( buffer.st_mode) ) { printf("SLINK!\n"); } else if( S_IXUSR(buffer.st_mode) ) { printf("IXUSR\n"); } else { printf("OTHER\n"); } } /*ディレクトリのクローズ処理(省略)*/ ----------------------------------- というような形です。 else if( S_IXUSR(buffer.st_mode) ) { printf("IXUSR\n"); } の文をぬけばコンパイルもとおり、実行もうまくいくのですが、これが入ってしまうとコンパイル自体「呼び出せるのは関数だけです」という??メッセージのエラーがでてしまいうまくとおりません。 どなたかアドバイスをお願いします。

みんなの回答

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

S_IXUSRは単なる定数なので、当然エラーします。 if( S_IXUSR & buffer.st_mode ) のような使い方をします。 ただ、これで実行ファイルとして判定していいかどうかは 多少疑問が残ります。 ファイルの属性で判定してよいか, S_IXGRP、S_IXOTHは調べなくてよいかとか。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html
momottie
質問者

お礼

ありがとうございます。少しわかった気がします。

関連するQ&A

  • UNIXの"find"コマンド同等のプログラム作成について

    お世話になっております。 現在UNIXの"-type f"オプションのついた"find"コマンドと同等のプログラムをC言語で作ろうとしています。 つまりディレクトリ内のファイル(サブディレクトリ内のファイル含む、ディレクトリは除外)を全てフルパスで表示するプログラムです。 現在下記の関数を作成したのですがうまく動いてくれません。 どなたかご教授いただけないでしょうか。 【問題】 プログラム内の(**)前後で"dir1"が変更される。 (**)前:"/ディレクトリA/" (**)後:"/ディレクトリA/ディレクトリA内のファイル1" 本当は"dir1"には:"/ディレクトリA/"のままであってほしいです。 "strcat"コマンドの仕様が影響しているのでしょうか。 int _find(char dir1[] , int k ,int l , int m ) { DIR *dir ; struct dirent *dp ; struct stat statbuf ; char txt[1000] ; if ( m == 0 ) l++ ; if ( (dir = opendir(dir1)) == NULL ){ printf("%s",dir1) ; perror("opendir") ; exit(1) ; } for( dp=readdir(dir) ; dp != NULL ; dp=readdir(dir) ){ if ( strcmp(dp->d_name,".") != 0 && strcmp(dp->d_name,"..") != 0 ){ /* ROOT_DIR名-にファイル名を付け加えて、フルパスにする */ strcpy( temp[k][l] , dir1) ; strcat( temp[k][l] , "/" ) ; strcat( temp[k][l] , dp->d_name ) ;  (**) stat( temp[k][l] , &statbuf ) ; if(S_ISDIR(statbuf.st_mode)){ l=_find(temp[k][l],k,l,1) ; }else{ sort[k][l]=temp[k][l] ; printf("temp[%d][%d]=%s\n",k,l,sort[k][l]); printf( "dir5=%s\n",dir1) ; l++ ; } } } closedir(dir) ; return l ; }

  • [C言語]トラバースするプログラム(linux)

    linux(ubuntu11.04)でコマンドラインからもらったディレクトリをトラバースするプログラムを作りたいんですがうまくいきません。 一応書けたのですがどうも予想と違う動きをしてしまいます。 #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<dirent.h> #include<string.h> static void do_traverse(char *patht, int t); int main(int argc, char *argv[]) { int i; if(argc<2) { fprintf(stderr,"%s: no arguments\n",argv[0]); exit(1); } for(i=1;i<argc;i++) { do_traverse(argv[i],0); } return 0; } static void do_traverse(char *path, int t) { DIR *d; struct dirent *ent; int i; d=opendir(path); if(!d) { perror(path); exit(1); } while((ent=readdir(d))!=NULL) { struct stat st; if(lstat(ent->d_name,&st)<0) { perror(ent->d_name); exit(1); } for(i=0;i<t;i++) { printf(" "); } printf("%s\n",ent->d_name); if((strcmp(".",ent->d_name))==0 || (strcmp("..",ent->d_name))==0 || S_ISLNK(st.st_mode)) { continue; } if(S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) { do_traverse(ent->d_name,t+1); } } closedir(d); } 例えばディレクトリaにファイルbとディレクトリcがあり、ディレクトリcの中にはファイルdとディレクトリeがあり、ディレクトリeの中にはファイルfがあるとします。 僕の理想では $./traverse a とすると .. . b c .. . d e .. . f となるはずなんですが(表示の順番は適当です)、実際は b .. . c となってしまいうまくトラバースしてくれません どうしてこうなるかわかりません 誰か助けてください お願いします

  • 名簿作成 表示について

    名簿作成のプログラム、コンパイルしたときに 自分で入れた名簿を全て表示させたいのですが main関数をどう変えれば出来るでしょうか? このままだと、1人分しか表示されません。 初心者なので丁寧に教えてくださればと思います。 #include<stdio.h> #define NAMELEN 30 #define NOLEN 10 char s; struct gakuseki{ char no[NOLEN]; char name[NAMELEN]; int age; }; struct gakuseki input_data(void){ struct gakuseki st; printf("input student number>"); scanf("%s",&st.no); /*getchar(); fgets(st.no,NOLEN,stdin);*/ printf("input name>"); getchar(); fgets(st.name,NAMELEN,stdin); printf("input age>"); scanf("%d",&st.age); printf("continue?(y/n)"); scanf("%s",&s); return st; }; void output_data(struct gakuseki g){ printf("----------------------------------\n"); printf("student number : %s\n",g.no); printf("name : %s\n",g.name); printf("age : %d\n",g.age); }; int main(){ int i,j; struct gakuseki stud; for(i=0;i<3;i++){ /* struct gakuseki stud;*/ stud=input_data(); if(s=='n') { break; }; }; output_data(stud); };

  • 'strcpy': 識別子が見つかりません

    またもやわからないことが・・・ Visual C++ 2005で以下は(一部なんですが)をコンパイルすると、 #include<stdio.h> #include<stdlib.h> FILE *fp; struct meibo{ char name[12]; double tokutenA[6]; double tokutenB[6]; }; void main(int argc,char *argv[]) { char fname[20]; printf("ファイル名\n"); scanf("%s",fname); strcpy(fname,argv[1]); void input(FILE *fp,struct meibo* a,int* end); struct meibo a[5]; FILE *fp; int ban,end; if((fp=fopen("d:\\test\\fname","w"))==NULL){ printf("開けません\n"); exit(1); } visual studio 2005\projects\meibo\meibo1.cpp(18) : error C3861: 'strcpy': 識別子が見つかりませんでした となります、どう言うことでしょうか。 よろしくお願いします。

  • 'strcpy': 識別子が見つかりません

    初心者でまたもやわからないことが・・・ Visual C++ 2005で以下は(一部なんですが)をコンパイルすると、 #include<stdio.h> #include<stdlib.h> FILE *fp; struct meibo{ char name[12]; double tokutenA[6]; double tokutenB[6]; }; void main(int argc,char *argv[]) { char fname[20]; printf("ファイル名\n"); scanf("%s",fname); strcpy(fname,argv[1]); void input(FILE *fp,struct meibo* a,int* end); struct meibo a[5]; FILE *fp; int ban,end; if((fp=fopen("d:\\test\\fname","w"))==NULL){ printf("開けません\n"); exit(1); } visual studio 2005\projects\meibo\meibo1.cpp(18) : error C3861: 'strcpy': 識別子が見つかりませんでした となります、どう言うことでしょうか。 よろしくお願いします。

  • ディレクトリの判別

    FreeBSD5.4でstat()関数のS_ISDIRを使ってディレクトリかどうかを判別したいのですが、 S_ISDIRでは普通のファイルもディレクトリと認識してしまいます。もしご存知の方がいらっしゃいましたら、何卒ご教授くださいませ。 --------------------------------------------- #include <stdio.h> #include <string.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <stdlib.h> int createFileList(char *directoryName){ DIR *directoryId; struct dirent *directoryPointer; struct stat fi; directoryId=opendir(directoryName); while((directoryPointer=readdir(directoryId))!=NULL){ stat(directoryPointer->d_name,&fi); if (!S_ISDIR(fi.st_mode)) printf("%s\n",directoryPointer->d_name); } closedir(directoryId); return 0; } ---------------------------------------------

  • UNIXの勉強

    下のようなディレクトリ中のファイルを出力するプログラムを作りました #include <sys/types.h> #include <dirent.h> #include "ourhdr.h" int main(int argc, char *argv[]) { DIR *dp: struct direct *dirp; if (argc != 2) err_quit("a single argument (the directory name) is required"); if ( (dp = opendir(argv[1]) ) == NULL) err_sys("can't open %s", argv[1]); while ( (dirp = readdir(dp) ) !=NULL) printf("%s\n", dirp->d_name); closedir(dp); exit(0); } windowsのcygwinでコンパイラしようとしたのですが、 ourhdr.h : NO such file or directory のように表示されコンパイルできません。どうすれば、コンパイルできるようになるのか教えてください。

  • fpus:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • fputs:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • いつもお世話になっております。http://oshiete.goo.n

    いつもお世話になっております。http://okwave.jp/qa/q5836517.htmlで質問させているものです。 皆さんのアドバイスを頂き、2分探索法で郵便番号から住所を検索するプログラムが出来たのですが、 住所から郵便番号を2分探索法で出すプログラムも同じ方法でやろうとしましたが、比較対象が漢字の為、大きい・小さいの判断できずに上手くプログラムが出来ていません。 csvファイルは読みデータをひとつに繋げてあいうえお順にソートしました プログラムを一部載せておきます(かなり省略済みですが…) #define NAME ken_all_address.csv int main(int argc,char *argv[]) { struct tb line; FILE *fp; char buff[SIZE], string_buff[SIZE]; char *address,*ret; int flag,linesu,linesu1,sum,count,up,up1,low,low1,center,center1; int i,j; long pos[FSIZE]; clock_t start,end; start = clock(); //引数処理 if((fq=fopen(NAME1,"r")) == NULL){ printf("ファイル%sが開けません\n",NAME1); return -1; } if((fp=fopen(NAME,"r")) == NULL){ printf("ファイル%sが開けません\n",NAME); return -1; } flag = 0; address = argv[1]; count=0; sum=0; if(atoi(address) == 0){ for(i=0; ;i++){ pos[i] = ftell(fq); ret=fgets( buff, sizeof(buff), fp ); if(ret==NULL){ break; } } linesu = i; //printf("%d",linesu); low=0; up=linesu-1; while(low <= up){ center=(up+low)/2; fseek(fq,pos[center-1],SEEK_SET); fgets( buff, sizeof(buff), fp ); strtok(buff,",\""); strtok(NULL,",\""); strcpy(line.now_num,strtok(NULL,",\"")); strtok(NULL,",\""); strtok(NULL,",\""); strtok(NULL,",\""); strcpy(line.kanji1,strtok(NULL,",\"")); strcpy(line.kanji2,strtok(NULL,",\"")); strcpy(line.kanji3,strtok(NULL,",\"")); strcpy(string_buff,line.kanji1); strcat(string_buff,line.kanji2); strcat(string_buff,line.kanji3); printf("%s %s %s\n",line.kanji1,line.kanji2,line.kanji3); if(strcmp(string_buff,address)==0){ printf("〒%s \n",line.now_num); flag=1; } if(strstr(string_buff,address) ==NULL){ low=center+1; } else{ up=center-1; } } } fclose(fp); if(flag==0 && atoi(argv[1]) == 0){ printf("「%s」に該当する郵便番号はありませんでした\n",address); } if(flag==0 && atoi(argv[1]) != 0){ printf("「%s」に該当する住所はありませんでした\n",address); } end = clock(); printf("引数=%s\n",address); printf("%.30f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC); printf("fgetsの実行回数=%d回\n",sum); printf("比較回数=%d回\n",count); printf("\n"); return 0; }

専門家に質問してみよう