Linuxプロセスの作成とマルチプロセス
3909 ワード
プロセスといえば、まず明確な概念の一つがプロセスとは何か、プロセスは「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が作成した新しいプロセスが親プロセスの正確なコピーであることです.
例:
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と書く必要があるので注意してください.
マルチプロセス同時実行を実現しました.
-プログラムのコンテキスト(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
マルチプロセス同時実行を実現しました.