execl()
コードを実行する前に、コードでI/Oリダイレクトを実行する必要があります。あなたは、シェルの実行の効果を実現したい場合は :
/user/Desktop/Fuzzer/clear/easy_fuzzer/buf < input
あなたは子コードでこのような何かを記述する必要があります:
const char *filename = "input"; // or "input.txt" — the question uses both
int fd = open(file, O_RDONLY);
if (fd < 0)
err_syserr("failed to open file %s for reading\n", filename);
if (dup2(fd, STDIN_FILENO) < 0)
err_syserr("failed to redirect %s to standard input\n", filename);
close(fd); // In theory, it could fail, but there isn't much you can do about it
const char *cmdpath = "/home/user/Desktop/Fuzzer/clear/easy_fuzzer/buf";
execl(cmdpath, "buf", (char *)NULL);
err_syserr("failed to execute program %s\n", cmdpath);
は、これは通常、すべての実行されたコードにする必要があります子供によって。
stderr.c
とstderr.h
からhttps://github.com/jleffler/soq/tree/master/src/libsoqには、err_syserr()
のコードがあります。 1行のエラー処理は、複数の行を書き出すよりも煩わしいことはありません。 exec*()
関数の戻り値をチェックする理由はないことに注意してください。関数が戻ると失敗します。成功した場合は、現在のプロセスの代わりに実行中の別のプロセスが存在します。
長時間のやり方が好きなら、システムがposix_spawn()
とその同僚をサポートしているかどうかを調べることができます。適切な一連の属性を設定することで、あらゆることができます。私のお金のために、上記のコードを書く方がはるかに簡単で明確です。
私はおそらくexecl()
を使用することはありません - それは引数リストではなく、それはコンパイル時に固定されていることを義務付けるの実行時に固定することができますので、私はおそらくexecv()
(あるいはexecvp()
)を使用すると思います。コードはargv[0]
の値としてbuf
を実行プログラムに渡します。完全なパス名をargv[0]
としたい場合、それを行うことができます。 execlp()
の最初の引数のファイル名の一部(又はexecvp()
、または任意の他の経路探索exec*()
機能)が全く/
を含む場合、それはありませんので、何パスベースの検索が、実行されないがあること
注例のようにコマンド名が絶対パス名である場合は、それらを使用するのに適しています。
できません。リダイレクションはシェル機能です。プログラムの入力に自分自身で入力を書き込む必要があります。 –
方法はありますか?私はfrokプロセスscanfに入力したい! –
プロセスにパイプを開き、入力ファイルを読んでプロセスに書き込みます。それはシェルがやっていることです。あるいは、シェルを実行してコマンドを実行するように指示することもできます。 –