2013-10-12 3 views
0

У меня возникла ситуация, когда я отправлял задания, которые выполнялись в течение пяти дней, но из-за ошибки во всей работе можно было потерять. Я сделал «системный» вызов для сжатия файла данных, а затем удалил исходный несжатый файл размером до 4G. Так что у меня есть это в коде CСценарий для изменения поведения запущенной программы C

strcpy(command,"data"); ////I should added a forward slash here "data/" 
    sprintf(command,"%scompress -c -i %s -o %s",command,name,out_name); 
    system(command); 
    remove(name); /////This is the problem 

Это ошибка в Sprintf линии, в которой то, что я хотел сделать, чтобы вызвать программу в данных/сжатия, но в связи с отсутствием «/» системы команда не работает. И, таким образом, полученные данные не сжимаются, а затем сразу же исходный файл DELETED не оставляет мне ничего! Если бы он был сжат, все было бы в порядке.

В настоящее время существует пять рабочих заданий в таком состоянии. Мне нужно каким-то образом отвлечь это поведение, чтобы я не потерял пять дней работы. Я думаю, чтобы создать поддельный скрипт с именем «datacompress» в текущем каталоге, чтобы изменить поведение запущенной программы. Могу ли я это сделать или есть лучшие варианты, если вообще?

+1

Два совета: не используйте тот же буфер, что и источник и пункт назначения в 'sprintf', вы не знаете, в каком порядке функция будет писать в ваш буфер. Во-вторых, вместо этого следует использовать 'snprintf', чтобы избежать возможных переполнений буфера. –

+0

Еще один совет - обновите свое резюме! –

+0

Я думаю, что это может быть мое плохое использование sprintf, которое вызвало проблему. Несмотря на то, что я написал strcpy с «данными», чтобы продемонстрировать отсутствующую косую черту, я фактически инициализировал ее «data /», но как-то слэш потерялся ... – danny

ответ

2

Вы можете сделать datacompress символьной ссылкой на data/compress. К сожалению, это не сработает, если $PATH этого процесса не включает ..

Другой вариант: удалить права на запись пользователя в каталог, содержащий name. Это приведет к сбою функции remove().

Если ваша система имеет списки контроля доступа, удалите разрешение удаления процесса в несжатом файле.

В то время как вы пытаетесь придумать решение, вы можете приостановить процесс с:

kill -STOP <pid> 
+0

Ok Я добавил символическую ссылку «ln -s data/compress datacompress». Надеюсь, что это работает. Но я не могу его исполнить, как скрипт, если означают, что символические символы работают так. Я не могу изменять права пользователя, потому что другие задания, которые работают с предыдущей версией exe, все еще работают. Спасибо за ваши предложения! – danny

+0

Только что понял, что это, вероятно, не сработает. Если имя команды не содержит '/', поиск выполняется в '$ PATH'. Поэтому, если '.' не находится в' $ PATH', он не будет выполнять команду в текущем каталоге. – Barmar

+0

К сожалению, программы закончились, но спасибо за ваши предложения. – danny

1

Создать жесткие ссылки (не символические ссылки) на файлы данных:

ln datafile datafile.bkp 

Когда программа удаляет исходный файл данных, содержимое файла останется под именем .bkp.

И затем исправить программу, чтобы проверить статус ошибки важных вещей, таких как команда compress.

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