2013-10-16 20 views
-1

對於以下C程序,execl返回-1,表示權限被拒絕錯誤。我檢查了讀,寫。執行我的可執行文件的權限,他們都是rwx。有人可以讓我知道爲什麼execl返回一個權限被拒絕的錯誤?非常感謝您對於以下C程序,execl返回-1,表示權限被拒絕錯誤

#include <stdio.h> 
#include <stddef.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <sys/shm.h> 
#include <errno.h> 
#include <semaphore.h> 

#define MAXLINE 256 
#define MAXARGS 128 
#define SHELL "/h/fchang03" // "/bin/sh" 

key_t shmkey; 
int shmid; 
sem_t *sem; 
int* p; 

struct statStuff { 
    int pid;     // %d 
    char comm[256];    // %s 
    char state;     // %c 
    int ppid;     // %d 
    int pgrp;     // %d 
    int session;    // %d 
    int tty_nr;     // %d 
    int tpgid;     // %d 
    unsigned long flags;  // %lu 
    unsigned long minflt;  // %lu 
    unsigned long cminflt;  // %lu 
    unsigned long majflt;  // %lu 
    unsigned long cmajflt;  // %lu 
    unsigned long utime;  // %lu 
    unsigned long stime;  // %lu 
    long cutime;    // %ld 
    long cstime;    // %ld 
    long priority;    // %ld 
    long nice;     // %ld 
    long num_threads;   // %ld 
    long itrealvalue;   // %ld 
    unsigned long starttime; // %lu 
    unsigned long vsize;  // %lu 
    long rss;     // %ld 
    unsigned long rlim;   // %lu 
    unsigned long startcode; // %lu 
    unsigned long endcode;  // %lu 
    unsigned long startstack; // %lu 
    unsigned long kstkesp;  // %lu 
    unsigned long kstkeip;  // %lu 
    unsigned long signal;  // %lu 
    unsigned long blocked;  // %lu 
    unsigned long sigignore; // %lu 
    unsigned long sigcatch;  // %lu 
    unsigned long wchan;  // %lu 
    unsigned long nswap;  // %lu 
    unsigned long cnswap;  // %lu 
    int exit_signal;   // %d 
    int processor;    // %d 
    unsigned long rt_priority; // %lu 
    unsigned long policy;  // %lu 
    unsigned long long delayacct_blkio_ticks; // %llu 
} ; 

static int readStat(int pid, struct statStuff *s) { 

    const char *format = "%d %s %c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %lu %lu %ld %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu %llu"; 

    char buf[256]; 
    FILE *proc; 
    sprintf(buf,"/proc/%d/stat",pid); 
    proc = fopen(buf,"r"); 
    if (proc) { 
     if (42==fscanf(proc, format, 
         &s->pid, 
         s->comm, 
         &s->state, 
         &s->ppid, 
         &s->pgrp, 
         &s->session, 
         &s->tty_nr, 
         &s->tpgid, 
         &s->flags, 
         &s->minflt, 
         &s->cminflt, 
         &s->majflt, 
         &s->cmajflt, 
         &s->utime, 
         &s->stime, 
         &s->cutime, 
         &s->cstime, 
         &s->priority, 
         &s->nice, 
         &s->num_threads, 
         &s->itrealvalue, 
         &s->starttime, 
         &s->vsize, 
         &s->rss, 
         &s->rlim, 
         &s->startcode, 
         &s->endcode, 
         &s->startstack, 
         &s->kstkesp, 
         &s->kstkeip, 
         &s->signal, 
         &s->blocked, 
         &s->sigignore, 
         &s->sigcatch, 
         &s->wchan, 
         &s->nswap, 
         &s->cnswap, 
         &s->exit_signal, 
         &s->processor, 
         &s->rt_priority, 
         &s->policy, 
         &s->delayacct_blkio_ticks 
         )) { 
      printf("Stack start = %x\n",s->startstack); 
      printf("Stack end = %x\n",s->kstkesp); 
      fclose(proc); 
      return 1; 
     } else { 
      fclose(proc); 
      return 0; 
     } 
    } else { 
     return 0; 
    } 
} 

int eval(const char *cmdline) 
{ 
    char *argv[MAXARGS]; 
    int bg; 
    pid_t pid; 
    int status; 
    struct statStuff test; 
    int value; 

    pid = fork(); 
    if (pid > 0){ 
     /* This is the parent process. */ 
     char* p; 
     int n_bytes = 256; 
     int bytes_read; 
     char buffer[256]; 

     printf("PARENT PROCESS 1\n"); 
     // while (!(*value)){ 
     // 
     // } 
     sleep(2); 
     printf("PARENT PROCESS 2\n"); 

     sem_getvalue(sem, &value); 
     sprintf(buffer,"/proc/%d/maps",value); 
     printf("buffer = %s\n",buffer); 
     int fd = open(buffer,O_RDONLY); 
     printf("fd = %d\n",fd); 
     p = (char *)malloc(256); 
     while (bytes_read = read(fd,p,n_bytes)){ 
      //printf("STRING = %s\n",p); 
      //break; 
      if (strstr(p,"[heap]") != NULL){ 
       printf("%s\n",p); 
      } 
      free(p); 
      p = (char *)malloc(256); 
      // lseek(fd,256,SEEK_CUR); 
     } 
     waitpid(pid, &status, 0); 
     //  execl(SHELL,SHELL,"-c",cmdline,NULL); 
     /* 
     memset(&test, 0, sizeof(struct statStuff)); 
     readStat(pid, &test); 
     //   _exit(EXIT_FAILURE); 
     */ 
    } 
    else if (pid < 0){ 
     /* The fork failed. Report failure. */ 
     status = -1; 
    } 
    else{ 
     printf("BOO!\n"); 
     sem = sem_open("pSem", O_CREAT | O_EXCL, pid); 
     printf("FOO!\n"); 
     //  sem_unlink("pSem"); 
     printf("HOWDY\n"); 
     // printf("ERROR = %d\n", 
     execl("/h/fchang03","/h/fchang03/two",0); 
     perror("execl"); 
    } 
} 

int main(void) 
{ 
    char cmdline[MAXLINE]; 
    char temp[MAXLINE]; 

    shmkey = ftok("/dev/null",5); 
    shmid = shmget(shmkey, sizeof (int), 0644 | IPC_CREAT); 
    if (shmid < 0){ 
     perror("shmget\n"); 
     exit(1); 
    } 

    p = (int *)shmat(shmid, NULL, 0); 
    *p = 0; 

    while (1){ 
     printf("> "); 
     fgets(temp, MAXLINE, stdin); 
     sprintf(cmdline,"./%s",temp); 
     if (feof(stdin)){ 
      exit(0); 
     } 
     printf("cmdline = %s\n",cmdline); 
     eval(cmdline); 
    } 

    shmdt(p); 
    shmctl(shmid, IPC_RMID, 0); 

    sem_destroy(sem); 
    exit(0); 
} 
+4

不完全確定我們需要229行代碼來分析單個'execl()'失敗,但我見過陌生人。 – WhozCraig

+1

是'/ h/fchang03' a *文件*還是*目錄*?當'execl'需要第一個參數的「path」時,它意味着可執行文件*的路徑。 – paddy

回答

5

此行

execl("/h/fchang03","/h/fchang03/two",0); 

建議您嘗試執行目錄。