2013-08-07 6 views
0

Я пытаюсь запустить минимальную программу оболочки терминала через сокет на машине unix. Когда я использую system("cd directory"), он не работает. Поэтому я немного поработал и столкнулся с chdir(), который выглядел так, как будто это сработает. Однако, когда я это пробовал, это давало мне ошибки каждый раз. Вот мой код:chdir() в C++ Получение ошибок

if (chdir(argument) < 0) { 
    send(sock, "[*] Directory does not exits!\n", strlen("[*] Directory does not exits!\n"), 0); 
} 
else { 
    string argumentString(argument); 
    string entireMessage = "[*] New working directory: " + argumentString; 
    char entireMessageChar[64]; 
    int i; 
    for (i = 0; entireMessage[i] != '\0'; i++) { 
     entireMessageChar[i] = entireMessage[i]; 
    } 
    send(sock, &entireMessage, strlen(entireMessageChar), 0); 
} 

Может кто-нибудь пожалуйста, скажите мне, почему chdir() не меняется каталогов? Спасибо.

+0

Невозможно сказать, не зная _exactly_, что такое код возврата 'chdir()'. Вы не можете просто выбросить его, проверяя, не отличен ли он от нуля, поэтому прямо сейчас этот вопрос не содержит достаточной информации, чтобы дать полезный ответ. –

+0

Хорошо, я получу код. – jamespick

+5

Кстати, причина 'system (" cd directory ")' не работает, так это то, что 'system()' запускает оболочку; оболочка изменится на новый каталог, а затем выйдет оболочка. То, что вы начали дочерний процесс, который изменил его каталог, не означает изменения вашего каталога. –

ответ

2

Значение errno после выхода chdir() должно быть проверено, чтобы определить, почему он не работает.

Возможные значения состояния выхода включают:

  • EACCESS (без разрешения на цели)
  • ENOENT (файл не существует)
  • ENOTDIR (мишень представляет собой файл, а не каталог).

Ознакомьтесь со всей документацией по реализации вашей операционной системы.

+2

Предполагая «chdir», совместимый с POSIX, он возвращает 0 при успехе и -1 при сбое. Если он терпит неудачу, он устанавливает 'errno' одно из этих значений. И вы должны установить 'errno' в 0 перед вызовом. –

+0

@KeithThompson Совершенно верно. Это то, что я получаю за попытку ответить на вопросы C спустя десятилетие в другом месте ... –

+0

Извините, если я смущаю кого-либо по моим комментариям. Errno возвращает 2 – jamespick

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