Linuxプロセスの作成とマルチプロセス


プロセスといえば、まず明確な概念の一つがプロセスとは何か、プロセスは「a program in execution」である.プロセスは次の要素で構成されます.
-プログラムのコンテキスト(context)で、プログラムが現在実行されている状態です.
–プログラムの現在の実行ディレクトリ
–プログラムがアクセスするファイルとディレクトリ
-プログラムの信頼状態またはアクセス権、ビットのファイルモードと所有権
–プロセスに割り当てられたメモリおよびその他のシステムリソース
この文書では、プロセスの作成について説明します.
最近私は1つのプロセスの操作についてのプログラムを书いて、前にプロセスに対して理解があって、しかし、プログラムを书いていないで、だからいつもドアの外でうろうろしている感じで、多くのものはただ大体を理解して、今回本当にプログラムを书く时、どのように手をつけるか分かりません.
1、システム関数
ヘッダファイル#includeに含める
関数プロトタイプ:int system(const char*command);
機能説明:system()は、/bin/sh-c commandを呼び出すことによって特定のcommandコマンドを実行し、commandが完了した後に戻ります.command実行中はSIGCHLD信号がブロックされ、SIGINTおよびSIGQUITは無視される.
戻り値:/bin/shが見つからない場合、systemは127を返す.
他のエラーが発生した場合は-1を返します.
実行に成功するとcommandのコードが返されます.
ただし、commandがNULLの場合、systemは0以外の値を返し、そうでない場合は0を返します.
例:
 
2、forkシステム呼び出し
forkは新しいプロセスの作成を呼び出します.新しいプロセスまたはサブプロセスは、プロセスを呼び出すか、親プロセスのコピーです.
Forkの文法は
#include
pid_t fork(void);
forkが正常に実行されると、親プロセスには子プロセスのPIDが返され、子プロセスには0が返されます.これはforkを1回だけ呼び出しても、彼は2回戻ります.
Forkが作成した新しいプロセスは、PIDとPPIDを除く親プロセスと同様のコピーであり、実際に有効なUIDとGID、プロセス組合せセッションID、環境、リソース制限、開いているファイル、共有メモリセグメントが含まれます.
親プロセスと子プロセスの間には少し違いがあります.サブプロセスは親プロセスのスーパーマーケット設定を継承していません(alarm呼び出しを使用します).
)親プロセスによって作成されたファイルロック、または未決信号.理解すべき重要な概念はforkが作成した新しいプロセスが親プロセスの正確なコピーであることです.
 
2、forkシステム呼び出し
forkは新しいプロセスの作成を呼び出します.新しいプロセスまたはサブプロセスは、プロセスを呼び出すか、親プロセスのコピーです.
Forkの文法は
#include
pid_t fork(void);
forkが正常に実行されると、親プロセスには子プロセスのPIDが返され、子プロセスには0が返されます.これはforkを1回だけ呼び出しても、彼は2回戻ります.
Forkが作成した新しいプロセスは、PIDとPPIDを除く親プロセスと同様のコピーであり、実際に有効なUIDとGID、プロセス組合せセッションID、環境、リソース制限、開いているファイル、共有メモリセグメントが含まれます.
親プロセスと子プロセスの間には少し違いがあります.サブプロセスは、親プロセスのスーパーマーケット設定(alarm呼び出しを使用)を継承していません.親プロセスが作成したファイルロック、または未決信号です.理解すべき重要な概念はforkが作成した新しいプロセスが親プロセスの正確なコピーであることです.
例:
#include
#include
#include
#include
int main(void)
{
	pid_t child;
	if((child = fork()) == -1)
	{
		perror("fork");
		exit(EXIT_FAILURE);
	}
	else if(child == 0)					//    
	{
		puts("in child");
		printf("\tchild pid = %d
",getpid()); printf("\tchild ppid = %d
",getppid()); exit(EXIT_SUCCESS); } else { puts("in parent"); printf("\tparent pid = %d
",getpid()); printf("\tparent ppid = %d
",getppid()); } exit(EXIT_SUCCESS); }

 
3、exec関数ファミリー
fork関数と同様にexecも宣言します.プロトタイプは次のとおりです.
int execl(const char *path, const char*arg, ...);
int execlp(const char *file, const char*arg, ...);
int execle(const char *path, const char*arg , ..., char * const envp[]);
int execv(const char *path, char *constargv[]);
int execvp(const char *file, char *constargv[]);
int execve(const char *path, char *constargv[], char *const envp[]);
 
execは、呼び出しプロセスのイメージを実行されたプログラムで完全に置き換えます.Forkは新しいプロセスを作成して新しいPIDを生成し、execは新しいプログラムを起動し、既存のプロセスを置き換えます.したがって、実行されるプロセスのPIDは変更されません.
例:
int execve(const char *path, char *constargv[], char *const envp[]);
3つのパラメータを受け取ります.
pathは、実行するバイナリファイルまたはスクリプトの完全なパスです.
argvは、プログラムに渡される完全なパラメータのリストであり、argv[0]を含む.一般的には実行プログラムの名前である.
Envpはexecedプログラムを実行するための専門環境へのポインタである.
 
これらの関数は、以下のように簡単に説明できます.
名前にlを含む関数:カンマで区切られたパラメータのリストを受け入れたい場合、リストはNULLポインタを終了フラグとし、これらのパラメータは実行されるプログラムに渡されます.
名前のパッケージvの関数:ベクトル、すなわち空で終わる文字列のポインタ配列を受け入れます.この配列は、終了フラグとしてNULLポインタを使用する必要があります.
ただし、そのNULLは、時々(char*)0と書く必要があるので注意してください.
 
//    num      :
//  batchscript      shell    。
void createsubprocess(int num)
{
	int i;
	int child;
	int pid[num];	
	for(i=0;i

マルチプロセス同時実行を実現しました.