execファミリーの関数を介してコマンドライン引数(具体的にはecho)を実行しようとしています。独自の実行可能ファイルを作成して実行すると、execv関数を実行できますが、touchまたはechoを実行しようとすると、-1が返されます。
#include <stdio.h>
#include <unistd.h> // exec functions
#include <sys/types.h> // pid_t
#include <sys/wait.h>
#define HIGH 1
#define LOW 0
int digitalWrite(int pin, short type) {
pid_t pid = fork();
if (pid == 0) {
printf("pid == %i\n", pid);
if (type == HIGH) {
char* args[] = {"echo", "1", ">", "/sys/class/gpio/gpio67/value", NULL};
int val = execv(args[0], args);
printf("ran function execl, %i\n", val);
} else {
printf("Unable to do anything but set pin to HIGH\n");
}
} else if (pid < 0) { // pid < 0
printf("fork failed\n");
}
wait(NULL);
}
int main() {
printf("Starting digitalWrite\n");
digitalWrite(0, HIGH);
printf("Completed digitalWrite()\n");
return 0;
}
コンテキストのために、ここに私のビルドがあります:
$ gcc wiringbeagle.c
$ ./a.out
Starting digitalWrite
pid == 0
ran function execl, -1
Completed digitalWrite()
Completed digitalWrite()
$ ls
a.out wiringbeagle.c
コマンドecho 1 > /sys/class/gpio/gpio67/value
はそれ自体でターミナルで正常に実行echo hi > tmpfile.txt
されます。ローカルファイルを作成して(つまり、tmpfile.txtにタッチして)実行しようとすると、コマンドラインで期待どおりに実行されますが、プログラムでは実行されません。
私はexecvで何かを理解していないに違いありません、そしてどんな援助も大いにありがたいです!
の最初の引数execv
は、実行されるファイルです。シェルとは異なりexecv
、PATH
環境変数で示されるディレクトリを検索しないため、実行可能ファイルへの完全なパスを指定する必要があります。echo
現在の作業ディレクトリに呼び出された実行可能ファイルがない限りexecv("echo",...)
、「ファイルが見つかりません」というエラーで失敗します。(perror
より良いエラーメッセージを取得するために使用します)。
シェルのように実行可能ファイルを検索する場合は、を使用しますexecvp
。ただし、シェルはおそらくecho
組み込みコマンドとして実行されるためecho
、シェルが使用するものと同じではないことに注意してください。この場合、それは問題ありません。
これを修正すると、別の問題が発生します。シェルを使用するのではなく、引数を使用してコマンドラインユーティリティを呼び出すだけなので、引数">"
は単なる引数です。これは、リダイレクト(およびパイプ、引用、その他の便利なもの)を処理するシェルです。したがって、達成するのは、3つの引数をstdoutに送信することだけです。
このsystem
関数を使用してシェルを使用してコマンドを実行するか、を実行するfreopen
前に子でstdoutを実行してリダイレクトを自分で設定することができますexecvp
。
このman
コマンドを使用すると、システムインターフェイスに関する非常に多くの情報を取得できます。たとえば、何をするかを学ぶにfreopen
は、を使用しますman freopen
。また、インターネット上のマンページを読むこともできます。http://man7.org/linux/man-pages/man3/freopen.3.htmlですが、ご使用のシステムのドキュメントはすぐそこにあり、システムにインストールされているソフトウェアの実際のバージョンにも適用されます(ドキュメントをインストールしました)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加