問題タブ [execve]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - pipe() および dup2() が C でどのように機能するかについての明確化
配管を処理する単純なシェルを作成しています。動作するコードはありますが、内部でどのように動作するのかよくわかりません。これは、理解するのに助けが必要な変更されたコード スニペットです (短くするためにエラー チェックを削除しました)。
質問には推測がありますが、推測はそれだけです。ここに私が持っている質問があります:
- ブロッキングはどこで実行されますか? 私が見たすべてのサンプル コードで、ブロッキング
read()
をwrite()
提供していますが、ここではそれらを使用する必要はありませんでした。パイプの読み取り側を指すように STDIN をコピーし、パイプの書き込み側を指すように STDOUT をコピーするだけです。私が推測しているのは、dup2(fd[0], 0)
実行後にSTDINがブロッキングを行っているということです。これは正しいです? - 私が理解していることから、実行中のプロセスごとに、ファイル テーブル内の開いているファイルを指す記述子テーブルがあります。プロセスが STDIN、STDOUT、または STDERR をリダイレクトするとどうなりますか? これらのファイル記述子は、すべてのプロセスの記述子テーブルで共有されていますか? それとも、プロセスごとにコピーがありますか? 1 つをリダイレクトすると、それらすべてに変更が反映されますか?
への呼び出し
/li>pipe()
とそれに続くへの呼び出しの後、fork()
開いているパイプの 4 つの「端」があります。親によってアクセスされる読み取りおよび書き込み端と、子によってアクセスされる読み取りおよび書き込み端です。私のコードでは、親の書き込み側と子の読み取り側を閉じています。ただし、パイプを使い終わった後、残りの 2 つの端は閉じません。コードは正常に動作するので、ある種の暗黙の終了が行われていると思いますが、それはすべて当て推量です。このように、残りの 2 つの端を閉じるために明示的な呼び出しを追加する必要がありますか?これは、配管プロセスがどのように機能するかについての概念的な質問です。ファイル ハンドル によって参照されるパイプの読み取り側と、ファイル ハンドル によって
fd[0]
参照されるパイプの書き込み側がありますfd[1]
。パイプ自体は、バイト ストリームによって表される単なる抽象化です。ファイルハンドルは開いているファイルを表していますよね?つまり、システムのどこかにfd[1]
、パイプを介して送信したいすべての情報が書き込まれたファイル ( で示される) があるということでしょうか? そして、バイト ストリームを介してその情報をプッシュした後、fd[0]
すべての情報が書き込まれたファイル ( で示される) が存在し、パイプの抽象化が作成されます。
iphone - iOS 7脱獄iPhoneでファイルプロパティを変更できません
私のデバイスはios 7を搭載したiphone 5sです。脱獄しています。
脱獄ios 7で次のコードを使用してファイルプロパティを変更できませんでしたが、iosバージョンが7未満の場合は成功します。私のコードは
実行後 [[NSFileManager defaultManager] setAttributes:newAttr ofItemAtPath:payloadPath エラー:nil]; iPhoneコンソールから次の情報を見つけることができます。
c - システムコール「execve」を実行できません
私は初心者なので、表現が不正確かもしれません。アセンブラで C のシステムコール「execve」を作成する必要があります。私はライブラリを使用しません。動かない部分は
コードをコンパイルします(エラーも警告も表示されません)
プログラムを実行しようとすると、次のメッセージが表示されます。
c - C プログラムの引数は '\0' で終了することが保証されていますか?
の引数についてmain()
、2011 C 標準は (5.1.2.2.1:2) と述べています。
argc の値が 0 より大きい場合、配列メンバー argv[0] から argv[argc-1] までは、文字列へのポインターを含みます。文字列には、プログラムの起動前にホスト環境によって実装定義の値が与えられます。
このコンテキストでの「文字列」という単語は、「0 で終わる文字列」、つまり、0 以外の文字の後に最後の '\0' が続くシーケンスとして解釈されるべきですか、それとも一部の実装ではプログラムに異なる方法で引数を渡す必要がありますか?
POSIX プラットフォームでは、exec*
関数ファミリの1 つの引数はexec*
、整形式の文字列へのポインターとして関数によって検証されますか (また、どのように?)、または setuid プログラムは整形式の 0-引数として終了文字列?
assembly - アセンブリ x86: 複数の引数を持つ execve
を実行するシェルコードを書きたいですsys_execve("/usr/bin/scp","usr/bin/scp",args,NULL)
。
これは完全なコマンドです:
scp -i /tmp/file -P 8989 /path/file user@ip:/home/user
問題は、多くの登録が必要なことです (scp の後に 6 つのトークンがあります)。
私はこのようにレジスタをプッシュしようとしました:
しかし、gdb と libemu を使用すると、ガベージ バイトしか生成されないことがわかりました。
この問題を解決する方法についてのヒントはありますか?
unix - execve() が成功しても戻らないのはなぜですか?
マニュアルページを読みました。
このリンクhttp://support.sas.com/documentation/onlinedoc/sasc/doc750/html/lr2/zid-7281.htmから理解したのは、
A successful call to execve does not have a return value because the new process image overlays the calling process image
なぜこれが起こるのか、私はあまり明確ではありませんか?また、新しいプロセスが呼び出し元のプロセスをオーバーレイする場合、失敗した場合にのみ返され、成功した場合に返されないのはなぜですか?