Mac OSX10.6.6とXCode3.2.4でいくつかのコードを実行していて、かなり標準的なコードがあります:fork()、pid == 0の場合、コマンドとargsを含むexecvp(argsにはコマンドが配列の最初の要素であり、配列はnullで終了します)。
これについては、オペレーティングシステムのクラスで説明します。割り当ては、単純なシェルを作成することです。リダイレクト(<と>)とパイプ(|)の両方の引数とスイッチを使用してコマンドを実行します。いくつか問題が発生しています。
1)デバッグ中にEXC_SOFTWARE信号を受け取ることがあります(これまでのところ、XCodeの外部でアプリを実行した場合は取得できませんが、Macを初めて使用するため、実行した場合にどのようになるかわかりません)
2)次のコマンドのgetlineが、他のcoutによって出力されたように見えるジャンクになることがあります。これは永遠にループし始め、指数関数的に壊れます。私はすべてのプロンプトで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シグナルであり、ループの問題で何が間違っているかを確認します。何かご意見は?
編集:
割り当てに必要なエラーチェックは非常に限られており、すべての入力が正しいと想定しています。正しいとは、アプリがコマンドを実行するために適切にフォーマットされ、制限されていることを意味します。つまり、奇妙なスペースカウント、非同期を実行する&、マルチパイピングコマンドなどはありません。