[解決済み】execvp: バッドアドレスエラー
質問
linuxで、様々なコマンドで動作するシェルを作成する作業をしています。
私はさまざまな組み込みコマンドを持っており、そのうちの1つは "歴史 "です。
私は
reshist()
関数で、ユーザが入力した内容を含む配列をリセットします。
また、システムコマンドを有効にするには
execvp()
また、複数パイプによる操作も可能です。
{コード
関数と多重パイプ操作は、一緒にしない場合はうまくいくのですが、両方使用すると
reshist()
というエラーが発生します。
reshist()関数が、リストに入力を追加するために正しく動作しないことは知っていますが、それは大きな問題ではありません。 問題は、なぜこのようなエラーが発生するのかということです。
何が原因なのでしょうか?一緒に動作させるために何か良いアイデアがあれば教えてください。
execvp()
解決するには?
を見逃すようです。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdbool.h>
#include <sys/types.h>
#include <signal.h>
#include <errno.h>
#define MAX_BUFFER 129 // max line buffer
#define MAX_ARGS 32 // max # args
#define SEPARATORS " \t\n" // token sparators
char *args[MAX_ARGS];
int print[16];
int get[16];
int fd[2];
char histarr[10][129]; // History array
char histel[129];
void reshist(void)
{
//HISTORY RESORTING
int counter = 0;
while (counter < 10)
{ //shifting all elements by one from the last element of the list
if (histarr[counter] == NULL )
{
strcpy(histarr[counter], histel); //first element of the history will contain the last command
break;
}
counter++;
}
if (counter == 10)
{
counter = 1;
while (counter < 10)
{
strcpy(histarr[counter - 1], histarr[counter]);
counter++;
}
strcpy(histarr[9], histel);
}
memset(histel, 0, 127);
//HISTORY RESORT ENDS
}
void setup(void)
{
char buf[MAX_BUFFER]; // line buffer
//char * args[MAX_ARGS]; // pointers to arg strings
char ** arg; // working pointer thru args
char * prompt = "333.sh>"; // shell prompt
/* keep reading input until "quit" command or eof of redirected input */
while (!feof(stdin))
{
/* get command line from input */
fputs(prompt, stdout); // write prompt
if (fgets(buf, MAX_BUFFER, stdin))
{ // read a line
/* tokenize the input into args array */
arg = args;
*arg++ = strtok(buf, SEPARATORS); // tokenize input
while ((*arg++ = strtok(NULL, SEPARATORS)))
;
// last entry will be NULL
strcpy(histel, buf);
reshist();
pid_t pid;
int print[16];
int get[16];
int fd[2];
int count = 0;
int i = 0;
while (args[i] != NULL )
{
if (0 == strcmp(args[i], "|"))
{
count++;
}
i++;
}
char *arrays[count + 1][i - count]; // array lines bordered as arrays[numberOfPipes+1][numberofArguments-numberOfPipes]
i = 0;
int x = 0;
int y = 0;
while (args[i] != NULL )
{
if (strcmp(args[i], "|") != 0)
{
arrays[x][y] = args[i]; //builting arrays that is going to be sent to the each process, each row of the matrix is an array to be sent to another process
y++;
}
else
{
x++;
y = 0;
}
i++;
}
int h = 0;
int a = 0;
int k = 0;
for (k = 0; k <= count; k++)
{
get[k] = -1;
print[k] = -1;
}
//create required number of pipes
for (a = 0; a < count; a++)
{
if (pipe(fd) == -1)
{
perror("Pipe failure");
continue;
}
get[a + 1] = fd[0];
print[a] = fd[1];
}
for (k = 0; k <= count; k++)
{
pid = fork();
if (pid < 0)
{
printf("fork failed\n");
}
else if (pid == 0)
{
if (print[k] != -1)
{
if (dup2(print[k], 1) == -1)
{
perror("dup2 error");
exit(1);
}
}
if (get[k] != -1)
{
if (dup2(get[k], 0) == -1)
{
perror("dup2read error");
exit(1);
}
}
for (h = 0; h <= count; h++)
{
close(print[h]);
close(get[h]);
}
if (execvp((const char*) arrays[k][0], arrays[k]) < 1)
{
perror("error");
exit(1);
}
exit(0);
}
else
{
int stat;
close(print[k]);
close(get[k]);
waitpid(pid, &stat, 0);
}
}
} // system command else ends
}
}
int main(void)
{
setup();
/**
* After reading user input, the steps are:
* (1) fork a child process using fork()
* (2) the child process will invoke execvp()
* (3) if command included &, parent will invoke wait()
*/
return 0;
}
NULL
arrays[k]
arrays[k]
NULL
if (execvp((const char*) arrays[k][0], arrays[k]) < 1)
if (execvp(arrays[k][0], arrays[k]) == -1)
execvp(arrays[k][0], arrays[k]);
perror("execvp() failed");
exec*()
関連
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み] テスト
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
-
[解決済み] '{'トークンの前に期待される式
-
[解決済み] rm, cp, mvコマンドで引数リストが長すぎるというエラーが発生する。
-
[解決済み] Bashの変数代入でCommand not foundエラーが発生する
-
[解決済み] 特定のコマンドを無視するBashのエラー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】malloc():メモリ破壊
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない