ここでは、コンテンツの一部ですが、また、変更を加えること。
ワン:目的や内容
フォーク学習()、EXEC、pthreadのライブラリ関数を使用して、ソースコードを読み取り、フォーク、EXEC、pthread_createの機能のメカニズムを分析します
コードの実装:
プロセスは子プロセスBを作成します
子プロセスBとAの親は、それぞれ別の実行ファイルに対応しています。実装プリントこんにちは、Bの累積合計
Bは、3つのプロセス・スレッドを有し、メインスレッド(1からパラメータxに)累積和を達成するために、新しいスレッドを作成し、スレッド2つのモニタ入力パラメータx
入力xが負でない整数、カウントスレッドである場合、スレッド1は、前のプログラム、入力スレッドと2非負整数及び1を再計算しなければならない最後のスレッドは異なる計算される場合、同じことが再計算されていない場合
あなたは、文字pを入力すると、1つのスレッドは中断します。
AとBの出口の全体のプロセスのスレッド情報を出た後に文字E 1プリントを入力
あなたが他の文字を入力した場合、スレッド1は入力エラーを印刷するには、タスクは継続します
などの実行ファイルのそれぞれの分析の基本的な情報のプロセッサ使用率、メモリ使用量、
二つのステップ
参照
LinuxのCプログラミング--fork()詳細 - 張秦、 - CSDNのブログ
[同時並行] _ [pthreadの] _ [労働者のが簡単な制御スレッド - 一時停止 - 続ける - 停止] - 穏やかな - CSDNのブログを
Linuxのマルチタスクプログラミング(C)---機能と基本的な実験の幹部の家族 - 王荘さんのブログ - CSDNのブログ
blankqdb - - ブログパークLinuxのマルチスレッドプログラミングとは、複数のパラメータのインスタンスを渡します
一時停止とpthreadのスレッドについての議論再開 - 一日のために小さなステップ - CSDNのブログを
要求の対象は、2つの実行は、AとBを発見必要 最初のAのモジュラー設計原理、そしてB.デザイン
1.節度、質問に応じて、プロセスAのコードを書くために
#include提供フォーク()、のexeclp()関数
書式#include <sysの/ wait.h>提供待機()関数
#include pid_tの種類の定義を提供
コードは、主に子プロセスを作成するには、子プロセスは新しいプロセスイメージで、現在のプロセスイメージを置き換える、比較的簡単です。
2.コードの後に子プロセスBを書きます
モジュラー設計アプローチをフル活用してください。
まず、ヘッダファイル
書式#include <pthread.hの> pthreadのライブラリ関数を提供
Linuxはデフォルトのライブラリのpthreadのではないので、ノート、プラス-lpthread GCCは、コンパイル時
いくつかのグローバル変数の後、トラブルスレッド間でパラメータを渡すを減らします。
1.メインスレッド
関数は、2つのサブスレッド、スレッド2の監視入力、スレッド1の印刷情報を作成し、累積計算することです。
スレッドが終了したとき1,2皇帝のスレッドが終了しているとき。
子スレッドを作成のpthread_create使用してください。
スレッドの終了を待ってpthread_joinを使用します
2.スレッド2
スレッド2は、入力を監視することがあるので、そのスレッド2を書きます。
スレッド2パートI:
メイン処理入力。
詳細については、コードの写真やコメントを参照してください。
制限の入力タイプが存在しないため、C ++ここで使用した入力文字列を処理
スレッド2パートII:
FUNCは、入力値に応じて定まります。グローバル変数としてスレッド1のFUNC調節状態
同時に、最近のCALとは、再計算するかどうかを決定します。ターゲットは、蓄積先の先頭からスレッド1です。
スレッド2パート3:
1 FUNC得られた糸の第二の部分の動作状態に応じて調整します。
FUNC == 2、pthread_joinを(の使用)は、エラーメッセージ、出口を印刷するスレッド1を待ちます。
pthread_suspend()pthread_resume()関数は、中断されたスレッドを達成するために、自分自身の定義の関数です。実験報告書の以降の部分を参照して、詳細な説明の実施を一時停止します。
3.スレッド1
第一部:スレッド1を一時停止します。
利用
pthread_mutex_lockの()、pthread_mutexunlock()、pthread_cond_waitの()、pthread_cond_broadcastの()は、スレッドを一時停止します。
ソースは、より明確な実装プロセスを中断具現化。
パートII:スレッド1は、操作情報出力を蓄積します
操作、二つの同一の入力、さまざまな動作設定を反映させるためのpスリープ。人々は、コンピュータがまだ到着していない第二の入力につながる、速度を算出入るとそうでない場合、速度は良くない、我々は最後の結果に来るかもしれません。
要約すると、以下の構造Bの工程
空pthread_suspend(無効)
空pthread_resume(COID)
無効スレッド1(void *型の引数)
無効スレッド2(void *型の引数)
メインint型()
III。などの実行ファイルのそれぞれの分析の基本的な情報のプロセッサ使用率、メモリ使用量、
ターミナルAに実行されているすべてのプロセスの最初の
pgrep 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。在服务器的配置和管理中,这个工具常被应用,简单明了;
然后打开另一个终端,pgrep -l A查看进程名和pid
pstree -p 26638。以树状图显示进程,并显示进程pid。可见父子进程和线程的关系。
ps -T -p 26639 可以查看进程B的线程信息。
使用top查看进程cpu和内存信息。
下图为示例:
top命令的第三行,cpu状态:
依次对应:
us:user 用户空间占用cpu的百分比
sy:system 内核空间占用cpu的百分比
ni:niced 改变过优先级的进程占用cpu的百分比
id:空闲cpu百分比
wa:IO wait IO等待占用cpu的百分比
hi:Hardware IRQ 硬中断 占用cpu的百分比
si:software 软中断 占用cpu的百分比
st:被hypervisor偷去的时间
top命令第四行,内存状态:
total,free ,used ,buff/cache
依次对应:物理内存总量,空闲内存总量,使用中的内存总量,缓冲内存量
进入top后,交互时,输入s,系统提示更改刷新间隔。输入0则不断刷新。
top -p 26638查看pid为26638的进程(即A)的信息
top -p - H 26639
top命令可以实时显示各个线程情况。要在top输出中开启线程查看,请调用top命令的“-H”选项,该选项会列出所有Linux线程。在top运行时,你也可以通过按“H”键将线程查看模式切换为开或关。
四 遇到的问题及解决:
1.编译时出现c++11标准库未定义错误,因为编译器使用的库版本不同。
解决:使用-l链接 stdc++
2. gcc编译时报错
解决:
在32位模式时,int 和指针类型变量都占32位在64位模式下,int占32位,指针变量占64位
3.如图
又是-lstdc++解决
五.实验结果记录:
执行程序A。程序A 父进程fork 出子进程,之后打印Hello, world!然后执行wait(),等待子进程结束。
子进程调用execlp,执行另一个执行体B。
执行体B中线程2开始监控输入。
输入15,是非负整数,之后线程1计算1累加到15.结果为120。120后跟着的15表明计算的是1-15累加。
输入16,是非负整数,之后线程1计算1累加到16.结果为136。136后跟着的16表明计算的是1-16累加。
输入18,之后输入20.线程2监控到由于20与18不同,故线程1不再进行1-18累加,而进行1-20累加。
输出210.
输入25,再输入25.线程2监控到25相同,不需要重新计算,打印信息“输入相同,不需要重新计算”。线程1计算第一个25,输出325.
输入afd。线程2监控,属于其他字符,线程1打印错误信息“input wrong”。
输入fg。线程2监控,属于其他字符,线程1打印错误信息“input wrong”。
输入p,线程1暂停执行。打印信息“pause”表明线程1已暂停。
输入123.线程2检测到是非负整数,先调用恢复函数解除线程1的暂停。之后打印信息“resume”表示线程1已经恢复。之后线程1执行1-123累加,输出7626.
输入e。线程2检测到要退出。之后线程1打印信息“A and B exited”表示主进程,子进程都要退出。之后主进程和子进程都退出。
结束。