如何使用ANSI C检查文件是否可执行?

我试图编写一个程序来检查目录中的文件。 当一个新的文件被创build时,我必须检查它是否可执行,如果是的话,我必须执行它。

我使用inotify接口,它工作正常,但我有一些问题,当我尝试检查文件是否可执行使用stat(2)。 我发现我没有执行它的权限。

传递给程序的目录的绝对path,我想检查创build权限问题?

int main(int argc,char * argv []){ int fd,wd,len,i=0; char buffer [EVENT_SIZE_BUF]; if(argc != 2) usage(); if((fd = inotify_init()) == -1) perror("inotify_init()"); if((wd = inotify_add_watch(fd,argv[1],IN_CREATE) -1)) perror("inotify_add_watch()"); while(1){ if((len = read(fd,buffer,EVENT_SIZE_BUF)) < 0) perror("read()"); struct inotify_event * ev = (struct inotify_event *)&buffer; if(ev->len > 0){ if(ev->mask & IN_CREATE && ((ev-> mask & IN_ISDIR) == 0x00)){ printf("SPY; new file is created %s\n",ev->name); char * path = strcat(argv[1],ev->name); printf("%s\n",path); struct stat sb; if(!stat(path,&sb)){ printf( (S_ISDIR(sb.st_mode)) ? "d" : "-"); printf( (sb.st_mode & S_IRUSR) ? "r" : "-"); printf( (sb.st_mode & S_IWUSR) ? "w" : "-"); printf( (sb.st_mode & S_IXUSR) ? "x" : "-"); printf( (sb.st_mode & S_IRGRP) ? "r" : "-"); printf( (sb.st_mode & S_IWGRP) ? "w" : "-"); printf( (sb.st_mode & S_IXGRP) ? "x" : "-"); printf( (sb.st_mode & S_IROTH) ? "r" : "-"); printf( (sb.st_mode & S_IWOTH) ? "w" : "-"); printf( (sb.st_mode & S_IXOTH) ? "x" : "-"); fflush(stdout); printf("\n"); } }else{ printf("dir\n"); } } } inotify_rm_watch(fd,wd); close(fd); return 0; } 

你正在使用linux,所以你可以使用access()函数

 if (access("/my/file", X_OK) != -1) { printf("execution permission enabled\n"); } else { printf("execution permission disabled\n"); } 

你在解决Renzo Davoli的练习吗? 🙂

然而,我卡住喜欢你,我发现用Nautilus复制一个可执行文件,它会创建一个“可执行(复制)”,返回X-Permission错误与stat()access()

复制与cp cp exe1 exe2它的作品!

这是我的代码:

 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <sys/inotify.h> #include <sys/stat.h> #define _GNU_SOURCE #define EVENT_SIZE ( sizeof (struct inotify_event) ) #define EVENT_BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) ) void main(int argc, char **argv){ int fd, wd, length, i=0; char buffer[EVENT_BUF_LEN]; char* dir = argv[1]; /*creating the INOTIFY instance*/ if((fd = inotify_init()) < 0) perror( "inotify_init" ); /*adding the directory into watch list. Here, the suggestion is to validate the existence of the directory before adding into monitoring list.*/ wd = inotify_add_watch( fd, dir, IN_CREATE | IN_DELETE ); while(1) { i=0; pid_t p; struct stat st; /*read to determine the event change happens on “/tmp” directory. Actually this read blocks until the change event occurs*/ if((length = read(fd, buffer, EVENT_BUF_LEN )) < 0) perror( "read" ); /*actually read return the list of change events happens. Here, read the change event one by one and process it accordingly.*/ while ( i < length ){ struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ]; if ( event->len ) { if ( event->mask & IN_CREATE ) { if ( event->mask & IN_ISDIR ) printf("New directory %s created.\n", event->name ); else{ printf("New file %s created.\n", event->name ); char* file_name; asprintf(&file_name, "%s/%s", dir, event->name); printf("Check if %s is executable\n", file_name); if (access(file_name, X_OK) == 0){ //If file is executable printf("Executable file! Call fork()\n"); if ((p = fork()) == 0) { // Child process: do your work here if (execlp(file_name, file_name, (char*) 0)<0) fprintf(stderr, "execlp error\n"); exit(0); } else{ while(waitpid(p, NULL, WNOHANG) != p); remove (event->name); printf("%s done & gone\n", event->name); } } else fprintf(stderr, "Not executable file\n"); } } else if ( event->mask & IN_DELETE ) { if ( event->mask & IN_ISDIR ) printf( "Directory %s deleted.\n", event->name ); else printf( "File %s deleted.\n", event->name ); } } i += EVENT_SIZE + event->len; } } /*removing the “/tmp” directory from the watch list.*/ inotify_rm_watch( fd, wd ); /*closing the INOTIFY instance*/ close( fd ); }