2012-06-06 4 views
4

Я могу скомпилировать эту программу, которая была предоставлена ​​мне, но что я должен развиваться дальше. У меня есть некоторые вопросы по этому поводу:Как запустить эту программу?

#include <sys/types.h> 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 

#define TIMEOUT (20) 

int main(int argc, char *argv[]) 
{ 
    pid_t pid; 
    if(argc > 1 && strncmp(argv[1], "-help", strlen(argv[1])) == 0) 
    { 
     fprintf(stderr, "Usage: RunSafe Prog [CommandLineArgs]\n\nRunSafe takes as arguments:\nthe program to be run (Prog) and its command line arguments (CommandLineArgs) (if any)\n\nRunSafe will execute Prog with its command line arguments and\nterminate it and any remaining childprocesses after %d seconds\n", TIMEOUT); 
     exit(0); 
    } 

    if((pid = fork()) == 0)  /* Fork off child */ 
    { 
     execvp(argv[1], argv+1); 
     fprintf(stderr,"RunSafe failed to execute: %s\n",argv[1]); 
     perror("Reason"); 
     kill(getppid(),SIGKILL); /* kill waiting parent */ 
     exit(errno);    /* execvp failed, no child - exit immediately */ 
    } 
    else if(pid != -1) 
    { 
     sleep(TIMEOUT); 
     if(kill(0,0) == 0)   /* are there processes left? */ 
    { 
     fprintf(stderr,"\nRunSafe: Attempting to kill remaining (child) processes\n"); 
     kill(0, SIGKILL);  /* send SIGKILL to all child processes */ 
    } 
    } 
    else 
    { 
     fprintf(stderr,"RunSafe failed to fork off child process\n"); 
     perror("Reason"); 
     } 

} 

Что означает мое предупреждение, когда я его компилирую?

$ gcc -o RunSafe RunSafe.c -lm 
RunSafe.c: In function ‘main’: 
RunSafe.c:30:44: warning: incompatible implicit declaration of built-in function ‘strlen’ [enabled by default] 

Почему я не могу выполнить файл?

$ file RunSafe 
RunSafe: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x0a128c8d71e16bfde4dbc316bdc329e4860a195f, not stripped 
[email protected]:/media/Lexar$ sudo chmod 777 RunSafe 
[email protected]:/media/Lexar$ ./RunSafe 
bash: ./RunSafe: Permission denied 
[email protected]:/media/Lexar$ sudo ./RunSafe 
sudo: ./RunSafe: command not found 

ответ

2

Во-первых, вам необходимо #include <string.h>, чтобы избавиться от этого предупреждения.

Во-вторых, ОС, вероятно, препятствует выполнению программ в файловой системе /media/Lexar, независимо от того, каковы их биты разрешения. Если вы наберете mount, вы, вероятно, увидите опцию noexec для /media/Lexar.

+0

Добавляя к ответу @ Greg, я считаю, что если опция noexec не является опцией монтирования, '/ media/Lexar' может быть другой тип файловой системы, вероятно, FAT или что-то еще. – g13n

+0

Простое FAT обычно недостаточно для предотвращения выполнения. –

+1

Ну, действительно, ОС не запускает программу, если ее на FAT. Хотя chmod будет успешным, исполняемый бит не будет установлен. Следовательно, оболочка будет жаловаться на разрешение отказа. – g13n

1

предупреждение: несовместимо неявное объявление о встроенной функции «STRLEN» [по умолчанию включено]

Вам нужно включить #include<string.h>, потому что strlen() объявлен в нем.

Попробуйте запустить exe в другом месте в вашей файловой системе, а не в смонтированном разделе, поскольку ошибка указывает по какой-либо причине, что у вас нет разрешений на этом смонтированном разделе.

+0

Вы правы. Теперь он работает после выполнения этих инструкций. Спасибо за ответ. –

Смежные вопросы