2013-10-10 5 views
-1

У меня есть своеобразная проблема в Linux2.4, C и с использованием gcc.linux cat: Нет такого файла или каталога

Существует небольшая программа для извлечения информации из файла с помощью cat & grep cmd.

#define tmpFile "/tmp/cli_tmp_file.txt" 
#define MAX_CMD 50 

void getRange() 
{ 
     char cmd[MAX_CMD+1]; 

     // remove the temp file first 
     snprintf(cmd, MAX_CMD, "rm -f %s", tmpFile); 
     system(cmd); 
     // create temp file 
     snprintf(cmd, MAX_CMD, "touch %s",tmpFile); 
     system(cmd); 
     // execute the command 
     snprintf(cmd, MAX_CMD, "echo \"Range:Max val 500\" > %s",tmpFile); 
     system(cmd); 
     // dump out the temp file so user could see 
     snprintf(cmd, MAX_CMD, "cat %s|grep \"Range\"", tmpFile); 
     system(cmd); 
     // remove the temp file 
     snprintf(cmd, MAX_CMD, "rm -f %s", tmpFile); 
     system(cmd); 
} 

, когда я исполняю этот код, я получаю выход в кошки: /tmp/cli_tmp_file.txt: Нет такого файла или каталога

Однако файл создается в папке TMP с содержимым

# pwd 
/tmp 
# ls -l 
-rw-r--r-- 1 root  root   68 Oct 10 12:54 cli_tmp_file.txt 

#more /tmp/cli_tmp_file.txt 
Range:Max val 500 

в ручном исполнении той же ЦМД, он отображает предполагаемый выход

# cat /tmp/cli_tmp_file.txt|grep Range 
Range:Max val 500 

Любая помощь будет оценена по достоинству. Спасибо заранее.

+2

Вы должны проверить возвращаемое значение 'system', чтобы увидеть, успешны ли команды. Кроме того, попробуйте распечатать буфер 'cmd' после каждого' snprintf', чтобы увидеть, содержит ли он намеченную команду. –

+0

удалите файл, повторите попытку. –

+0

Избегайте использования 'system' с' rm'; рассмотрите возможность вызова функции [remove (3)] (http://man7.org/linux/man-pages/man3/remove.3.html). И для создания файла просто 'fopen' его для записи и' fclose' его сразу после. Не забудьте проверить на отказ от каждой функции. –

ответ

1

Это перехват (управляемый, но игнорируемый) буфера, команда echo содержит более 50 символов. Команда усекается snprintf(), но вы все равно запускаете ее. Проверьте возвращаемые значения!

+0

это, похоже, не больше в его примере. но определенно опасно. –

+0

Спасибо, добавив, что спать через 1 секунду после касания разрешил эту проблему. –

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