2015-02-23 6 views
0
if(cmds.at(i)==">") 
{ 
      //convert strings to char*s 
      char* conversion = new char[cmds.at(i-1).size()+1]; 
      copy(cmds.at(i-1).begin(),cmds.at(i-1).end(),conversion); 
      conversion[cmds.at(i-1).size()] = '\0'; 
      const char * out_file_cstring = cmds.at(i+1).c_str(); 

      //count and agregate arguments 
      int size = count_arguments(conversion); 
      size++; 
      char** args= new char*[size];//dont forget to delete 
      args[0] = strtok(conversion," \n"); 
      for(int j = 1; j<size; j++){args[j] = strtok(NULL, " \n");} 
      args[size-1]= NULL; 

      //forking and redirection 
      int out_file = open(out_file_cstring,O_CREAT|O_WRONLY|O_TRUNC); 
      pid_t pid = fork(); 
      if(!pid) 
      { 
       dup2(out_file,STDOUT_FILENO); 
       close(out_file); 
       int r = execvp(args[0],args); 
       if(r<0) 
       { 
         cerr<<"ERROR : exec failed"<<args[0]<<endl; 
         return false; 
       } 
} 

Так что мой код правильно создает и записывает в out_file. Однако по какой-либо причине файл является исполняемым. Я думаю, что ошибка в моем вызове open(), но я не могу найти почему.системный вызов open() создание исполняемого файла

ответ

1

man 2 open объясняет, почему:

int open(const char *pathname, int flags); 
int open(const char *pathname, int flags, mode_t mode); 

O_CREAT: 
If the file does not exist it will be created. [...] 
The permissions of the created file are (mode & ~umask). 

Так что, если вы хотите файл, это не исполняемый файл, вы можете использовать:

open(out_file_cstring,O_CREAT|O_WRONLY|O_TRUNC, 0666); 

0666 предложит чтение/запись для всех (эквивалент постоянных флагов S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH), а пользовательский umask далее ограничит окончательные разрешения выбранным пользователем значением по умолчанию.