タグ付けされた質問 「fork」

7
新しいプロセスを作成するために分岐する必要があるのはなぜですか?
Unixでは、新しいプロセスを作成するたびに、現在のプロセスを分岐し、親プロセスとまったく同じ新しい子プロセスを作成します。次に、execシステムコールを実行して、親プロセスのすべてのデータを新しいプロセスのデータに置き換えます。 なぜ最初に親プロセスのコピーを作成し、新しいプロセスを直接作成しないのですか?

3
フォークボムでシステムをクラッシュできないのはなぜですか?
最近、GNU / Linuxのプロセスに関する情報を掘り下げて、悪名高いfork bombに出会いました。 :(){ : | :& }; : 理論的には、システムがリソースを使い果たすまで無限に複製することになっています... ただし、CLI DebianとGUI Mintディストリビューションの両方でテストしてみましたが、システムに大きな影響は与えないようです。はい、大量のプロセスが作成されます。しばらくすると、次のようなコンソールメッセージを読みました。 bash:fork:リソースは一時的に利用できません bash:fork:retry:子プロセスはありません しかし、しばらくすると、すべてのプロセスが強制終了され、すべてが正常に戻ります。ulimitがユーザーごとのプロセスの最大量を設定したことを読んだことがありますが、それを実際に上げることはできないようです。 フォークボムに対するシステム保護とは何ですか?すべてがフリーズするか、少なくとも大幅に遅れるまで、なぜ自己複製しないのですか?フォークボムでシステムを本当にクラッシュさせる方法はありますか?
54 linux  process  fork  ulimit 

4
fork()を使用したプログラムが出力を複数回印刷することがあるのはなぜですか?
プログラム1では1 Hello world回だけ印刷されますが、削除 \nして実行すると(プログラム2)、出力が8回印刷されます。誰かが私に\nここの重要性とそれがどのように影響するかを説明してもらえますかfork()? プログラム1 #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { printf("hello world...\n"); fork(); fork(); fork(); } 出力1: hello world... プログラム2 #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { printf("hello world..."); fork(); fork(); fork(); } 出力2: hello world... hello world...hello world...hello world...hello …
50 c  fork 

2
デフォルトのプロセス作成メカニズムがフォークするのはなぜですか?
プロセス作成のためのUNIXシステムコールfork()は、親プロセスをコピーして子プロセスを作成します。私の理解では、これにはほとんど常にexec()の呼び出しが続き、子プロセスのメモリスペース(テキストセグメントを含む)を置き換えます。fork()で親のメモリ空間をコピーすることは常に無駄に思えました(ただし、メモリセグメントをコピーオンライトにするとポインタのみがコピーされるため、無駄を最小限に抑えることができます)。とにかく、プロセスの作成にこの複製アプローチが必要な理由を誰もが知っていますか?


4
子プロセスが親と一緒に死ぬUNIXバリアントはありますか?
Linuxカーネルの動作をかなり長い間研究してきましたが、次のことが常に明らかでした。 プロセス・ダイは、そのすべての子がバックに与えられている場合にはinit、プロセス(PID 1)彼らは最終的に死ぬまで。 しかし、最近、カーネルについて私よりもはるかに多くの経験を持っている人が私に言った: プロセスが終了すると、そのすべての子も死にます(使用NOHUPした場合を除き、子はに戻りますinit)。 今、私はこれを信じていませんが、私はそれを確かめるためにまだ簡単なプログラムを書きました。sleepすべてがプロセスのスケジューリングに依存しているため、テストに時間()に依存するべきではないことを知っていますが、この単純なケースでは、それで十分だと思います。 int main(void){ printf("Father process spawned (%d).\n", getpid()); sleep(5); if(fork() == 0){ printf("Child process spawned (%d => %d).\n", getppid(), getpid()); sleep(15); printf("Child process exiting (%d => %d).\n", getppid(), getpid()); exit(0); } sleep(5); printf(stdout, "Father process exiting (%d).\n", getpid()); return EXIT_SUCCESS; } これはプログラムの出力であり、話すpsたびに関連する結果がありますprintf: $ ./test & …
41 process  init  exit  fork 

3
4.3カーネルで「リソースが一時的に利用不可」でスレッドの作成が失敗する
いくつかのコンテナでArch Linux(カーネル4.3.3-2)でdockerサーバーを実行しています。前回の再起動以来、ドッカーサーバーとコンテナ内のランダムプログラムの両方がクラッシュし、スレッドを作成できない、または(あまり頻繁ではありませんが)フォークするというメッセージが表示されます。特定のエラーメッセージはプログラムによって異なりますが、それらのほとんどは特定のエラーに言及しているようですResource temporarily unavailable。エラーメッセージの例については、この投稿の最後をご覧ください。 今、このエラーメッセージを受け取った人がたくさんいますし、彼らへの応答もたくさんあります。本当にイライラするのは、誰もが問題を解決する方法を推測しているように見えることですが、問題の多くの考えられる原因のどれが存在するかを特定する方法を誰も指摘していないようです。 エラーの考えられる5つの原因と、それらがシステムに存在しないことを確認する方法を収集しました。 /proc/sys/kernel/threads-max(source)で設定されるスレッドの数にはシステム全体の制限があります。私の場合、これはに設定されてい60613ます。 すべてのスレッドはスタック内のスペースを使用します。スタックサイズの制限はulimit -s(source)を使用して構成されます。私のシェルの制限があることに使用される8192が、私は置くことによって、それが増加している* soft stack 32768に/etc/security/limits.confので、ulimit -s今戻ります32768。私も入れてドッキングウィンドウのプロセスのためにそれを増加しているLimitSTACK=33554432に/etc/systemd/system/docker.service(ソース、と私は限界が覗くことで適用されていることを確認/proc/<pid of docker>/limitsし、実行することにより、ulimit -sドッキングウィンドウコンテナ内。 すべてのスレッドはいくらかのメモリを消費します。仮想メモリの制限は、を使用して構成されますulimit -v。私のシステムではに設定されてunlimitedおり、3 GBのメモリの80%が無料です。 を使用するプロセスの数には制限がありますulimit -u。この場合、スレッドはプロセスとしてカウントされます(source)。私のシステムでは、制限はに設定されて30306おり、Dockerデーモンおよび内部のdockerコンテナの場合、制限は1048576です。現在実行中のスレッドの数は、実行ls -1d /proc/*/task/* | wc -lまたは実行ps -elfT | wc -l(source)によって確認できます。私のシステムでは、それらはとの間に700あり800ます。 開いているファイルの数には制限があります。一部のソースによると、これはスレッドを作成するときにも関係します。制限はを使用して設定されますulimit -n。私のシステムと内部ドッカーでは、制限がに設定されてい1048576ます。開いているファイルの数はlsof | wc -l(source)を使用して調べることができます30000。私のシステムでは約です。 最後のリブート前にカーネル4.2.5-1を実行していたように見えますが、現在は4.3.3-2を実行しています。4.2.5-1にダウングレードすると、すべての問題が修正されます。この問題に言及している他の投稿はthisとthisです。Arch Linuxのバグレポートを開きました。 これを引き起こしている可能性のあるカーネルの変更点は何ですか? エラーメッセージの例を次に示します。 Crash dump was written to: erl_crash.dump Failed to create aux thread …
39 linux  docker  limit  fork  thread 

3
2.6カーネルLinuxでのフォークとクローン
フォークとクローンに関して混乱があります。私はそれを見てきました: forkはプロセス用で、cloneはスレッド用です forkは単にcloneを呼び出し、cloneはすべてのプロセスとスレッドに使用されます これらのどちらかが正確ですか?2.6 Linuxカーネルでのこれら2つのシステムコールの違いは何ですか?
37 linux  fork 

3
fork:再試行:リソースは一時的に利用できません
サーバーに接続している間、 -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: Resource temporarily unavailable そして、次のコマンドも試してみると、結果は同じです。 -bash-4.1$ df -h -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource …
31 linux  fork 

3
fork()はLinuxのプロセスヒープ全体をすぐにコピーしますか?
fork()システムコールは、実行中のプロセスから子プロセスのクローン。2つのプロセスは、PIDを除いて同一です。 当然、プロセスがヒープに書き込むのではなく、ヒープから読み取るだけの場合、ヒープのコピーはメモリの大きな浪費になります。 プロセスヒープ全体がコピーされますか?書き込みのみがヒープコピーをトリガーするように最適化されていますか?
30 linux  fork 

3
「&」を使用してすでに分岐している場合、「nohup」が必要になるのはいつですか?
まず、この質問は関連していますが、間違いなくこの非常に素晴らしい質問と同じではありません。 nohup、disown、および&の違い 何かを理解したいのです。「&」を実行すると、正しく分岐しますか? 「nohup ...&」を実行するのは便利ですか、それとも単に&だけで十分ですか? 「&」を使用しているのに「nohup」を使用したいというケースを誰かが示すことができますか?
26 shell  nohup  fork 

3
bashはCのfork()と同様にフォークをサポートしていますか?
ある時点で分岐したいスクリプトがあるので、同じスクリプトの2つのコピーが実行されています。 たとえば、次のbashスクリプトが存在するようにします。 echo $$ do_fork() echo $$ このbashスクリプトが本当に存在する場合、予想される出力は次のようになります。 <ProcessA PID> <ProcessB PID> <ProcessA PID> または <ProcessA PID> <ProcessA PID> <ProcessB PID> この種の出力を取得するため、またはbashスクリプトにCのようなフォークを実行させるために、「do_fork()」の代わりに配置できるものはありますか?
25 shell  fork 

3
fork()のコピーオンライトは複数のフォークをどのように処理しますか?
ウィキペディアによると(これは間違っている可能性があります) fork()システムコールが発行されると、親プロセスに対応するすべてのページのコピーが作成され、子プロセスのOSによって別のメモリ位置にロードされます。しかし、これは特定の場合には必要ありません。子がexecシステムコール(Cプログラム内から実行可能ファイルを実行するために使用されます)を実行するか、fork()。親プロセスのコマンドを実行するためだけに子が必要な場合、親プロセスのページをコピーする必要はありません。execこれは、子プロセスを呼び出したプロセスのアドレス空間を実行するコマンドで置き換えるためです。 このような場合、コピーオンライト(COW)と呼ばれる手法が使用されます。この手法では、分岐が発生したときに、親プロセスのページは子プロセス用にコピーされません。代わりに、ページは子プロセスと親プロセスの間で共有されます。プロセス(親または子)がページを変更するたびに、その特定のページのみの個別のコピーが、変更を実行したプロセス(親または子)に対して作成されます。このプロセスは、今後のすべての参照で共有ページではなく、新しくコピーされたページを使用します。他のプロセス(共有ページを変更しなかったプロセス)は、ページの元のコピー(共有されなくなった)を引き続き使用します。この手法は、何らかのプロセスがページを書き込むときにページがコピーされるため、コピーオンライトと呼ばれます。 いずれかのプロセスがページに書き込もうとすると、ページの新しいコピーが割り当てられ、ページフォールトを生成したプロセスに割り当てられるようです。元のページは、後で書き込み可能とマークされます。 私の質問はfork()、プロセスが共有ページへの書き込みを試みる前に複数回呼び出された場合はどうなりますか?
23 linux  c  fork 

1
フォークボムはどのように機能しますか?
警告は、生産マシンでこれを実行しようとしないでください トピックに関するウィキペディアのページを読むとき、私は通常、次のコードで何が起こっているのかを追跡します。 :(){ :|:& };: 説明の抜粋 次のフォーク爆弾は、2002年に芸術として発表されました。56 その正確な起源は不明ですが、2002年より前にUsenetに存在していました。爆弾は、次の13文字をbashやzshなどのUNIXシェルに貼り付けることで実行され ます。「:」という関数を定義して動作します。この関数は、フォアグラウンドで1回、バックグラウンドで1回の2回呼び出されます。 ただし、最後の部分は完全には明確ではありません。関数定義が表示されます: :(){ ... } しかし、他に何が起こっていますか?また、のような他のシェルを行うksh、cshとtcshも似たようなを構築することができるという同じ運命に苦しみますか?
22 bash  shell-script  zsh  fork 

4
fork()の後、子はどこで実行を開始しますか?
UNIXプログラミングを学ぼうとしていますが、fork()に関する質問に遭遇しました。fork()は現在実行中のプロセスと同じプロセスを作成することを理解していますが、どこから開始するのですか?たとえば、コードがある場合 int main (int argc, char **argv) { int retval; printf ("This is most definitely the parent process\n"); fflush (stdout); retval = fork (); printf ("Which process printed this?\n"); return (EXIT_SUCCESS); } 出力は次のとおりです。 これは最も確実に親プロセスです どのプロセスがこれを印刷しましたか? どのプロセスがこれを印刷しましたか? 私はそれfork()が同じプロセスを作成すると思ったので、最初はそのプログラムでは、fork()呼び出しは永久に再帰的に呼び出されると考えました。から作成された新しいプロセスfork()は、fork()呼び出し後に開始すると思いますか? 次のコードを追加して、親プロセスと子プロセスを区別する場合、 if (child_pid = fork ()) printf ("This is the parent, child pid …
22 process  c  fork  api 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.