主に配管を行うシェルを実装しようとしています。私はこのテストケースを書いていますが、私は単にlsをwcにパイプすることを期待しています...それは間違いなく期待どおりに動作しません。 lsを端末に出力し、メモリを使い果たします。 これを修正して動作させる方法がとても失われています。 find_pathはすべてのテストで動作します。C Unix Pipes例
編集 - 私はプロジェクトのためにexecvを使う必要があります。そのクラスのことですが、私はexecvpで試してみました。まったく同じことをします。これは単なる例であり、なぜ動作しないのかを調べるためのテストです。私はコマンドとwaitpidの両方に対してforkを2回呼びます。何もする必要がないからです。
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
int find_path(char* execname, char** dst)
{
char *path = getenv("PATH");
path = strdup(path);
char *pos;
path = strtok_r(path, ":", &pos);
char *originalpath = path;
do
{
char* test = (char*)calloc(strlen(path) + strlen(execname) + 2, sizeof(char));
test = strcpy(test, path);
int testlen = strlen(test);
(*(test+testlen)) = '/';
strcpy(test + testlen + 1,execname);
struct stat buf;
int result = stat(test, &buf);
if (result == 0)
{
*dst = test;
free (originalpath);
return 1;
}
else
{
free(test);
}
} while ((path = strtok_r(NULL, ":", &pos)) != NULL);
free(originalpath);
return 0;
}
int main()
{
char *cmd1 = "ls";
char *cmd2 = "wc";
int filedes[2];
pipe(filedes);
char** argv = (char**)calloc(1, sizeof(char*));
argv[0] = (char*)malloc(sizeof(char*));
argv[0] = NULL;
pid_t pid = fork();
if (pid == 0)
{
char *path;
find_path(cmd1, &path);
dup2(filedes[1],stdout);
execv(path,argv);
}
pid = fork();
if (pid == 0)
{
dup2(filedes[0], stdin);
char *path;
find_path(cmd2, &path);
execv(path, argv);
}
else
waitpid(pid);
}
を(タイプ
FILE*
である)の値stdout
とstdin
を混乱されたあなたは、昨年のラッシュを見てきました"fork ... pipe ... exec ..."という質問でシェルを実装するには?その答えはおそらくそれらのうちの1つ(より多くの可能性が高い)にあります。 –