現在、入力を取得して文字列 (char*) 配列に格納するシェルをプログラミングしています。パイプラインなどの UNIX 操作を有効にするために、次のようなコマンドを記述できるようにしたいと考えています。
echo this | function more | function2
これを行うには、while ループでコマンドとその引数を収集し、引数配列のすべての内容を、コマンド ライン全体を保持する新しい 2 次元配列 (" " など) にコピーしようとしますls -f -a
。これまでのところ、これは機能しますが|
、コマンド ラインで|
「'\0'
元の入力の終わり:
char* arguments[MAXARGS]; // holds argument components, e.g. "ls" or "-f"
char** arg_collection[MAXARGS][MAXARGS]; // supposed to hold command lines, e.g. "ls -f -a"
argc_current = 0; // iterator for the loop, counts arguments
col_iterator = 0; // iterator for amount of command lines
int sentinel = 1; // sentinel value for while loop
...
while(sentinel)
{
arguments[argc_current] = (char*) malloc (sizeof(word)); // word is defined, just not listed on here - refers to the currently read command / argument
strcpy(arguments[argc_current], word); // copy current word into arguments
if(tokens[argc_current] == TOKEN_TERMINATOR || tokens[argc_curernt] == TOKEN_NULL)
{
sentinel = 0; // tokens holds information about the type of word, e.g. if it is '\0'
}
if(tokens[argc_current] == T_BAR) // if the word is "|"
{
for(i = 0; i < argc_current; i++)
{
strcpy(arg_collection[col_iterator][i], arguments[i]); // copy argument list into collection
}
col_iterator++; // increment command line counter
argc_current = 0; // reset argument counter, restart the loop
}
else
{
arg_current++; // increment current argument counter
}
}
evaluating arguments here..
最初のループは正常に機能します。たとえば、次のように入力すると
echo this | echo more |
arg_collection[0][0]
とを満たすarg_collection[0][1]
のでecho this
、結果として " " が得られます。しかし、1 にインクリメントcol_iterator
した後、2 番目の「|」に気付いて strcpy を呼び出すと、セグメンテーション違反という形でレンガの壁にぶつかりました。なんで?