Я запускаю некоторый код на Mac OSX 10.6.6 и XCode 3.2.4, и у меня есть довольно стандартный код: fork (), если pid == 0, тогда execvp с командой и аргументами (аргументы включают команда в качестве первого элемента в массиве, и массив завершается нулем).
Мы рассмотрим это в моем классе «Операционные системы», и наша задача - написать простую оболочку. Запускайте команды с их аргументами и переключателями, как перенаправления (<и>), так и pipe (|). У меня несколько проблем.
1) Иногда я получаю сигнал EXC_SOFTWARE во время отладки (до сих пор я не получил его, если я запускаю приложение за пределами XCode, но я новичок в Mac и не знаю, как это будет выглядеть, если я сделал)
2) Иногда getline для следующей команды становится ненужным, который, кажется, печатается другими кутами. Это начинается цикл навсегда, экспоненциально ломая. Я тестировал печать getpid () с каждой подсказкой, и только начальный процесс печатает их, у меня, похоже, нет случайной «бомбы-вилки».
Вот что у меня есть:
#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;
char** Split(char* buffer, int &count) {
count = 1;
for (int i = 0; i < strlen(buffer); i++) {
if (buffer[i] == ' ') {
count++;
}
}
const char* delim = " ";
char* t = strtok(buffer, delim);
char** args = new char*[count + 1];
for (int i = 0; i < count; i++) {
args[i] = t;
t = strtok(NULL, delim);
}
args[count] = 0;
return args;
}
void Run(char** argv, int argc) {
int pid = 0;
if ((pid = fork()) == 0) {
//for testing purposes, print all of argv
for (int i = 0; i < argc; i++) {
cout << "{" << argv[i] << "}" << endl;
}
execvp(argv[0], argv);
cout << "ERROR 1" << endl;
exit(1);
} else if (pid < 0) {
cout << "ERROR 2" << endl;
exit(2);
}
wait(NULL);
}
int main(int argc, char * const argv[]) {
char buffer[512];
char prompt[] = ":> ";
int count = 0;
while (true) {
cout << prompt;
cin.getline(buffer, 512);
char **split = Split(buffer, count);
Run(split, count);
}
}
Это именно то, что у меня есть, вы должны уметь вырезать, вставлять и строить.
Я не лучший в C ++, и есть вероятность утечки памяти, когда я не удаляю split
, но мой главный фокус - сигнал EXC_SOFTWARE и посмотрите, что я делаю неправильно с моей проблемой зацикливания. Есть мысли?
EDIT:
Назначение требует очень ограниченной проверки ошибок, и я предполагаю, что все данные введены правильно. Под правильным я подразумеваю правильно отформатированный и ограниченный для моего приложения для выполнения команды, то есть без странного подсчета пространства, без & для асинхронного запуска, без многопоточных команд и т. Д.