linux-プロセス置換
2885 ワード
プロセスにSIGINT信号を送信する場合、プロセスの信号処理関数は終了するまで10秒かかり、その後10秒以内にSIGINT信号を送信し、プロセスが実行される場合.1、2回目の信号が1回目と違うとしたら??2、信号処理関数はできるだけ速くする必要がある.
コード//
プロセス置換:
exec
一連の関数がプロセスに置き換えられる方法:実行中のプロセスは、ディスクに格納されたプログラム(実行可能ファイル)を使用して何らかの方法で実行されます.
オーバーライド(Override)
元のプロセスのすべての命令とデータ.
int execl(char *pathfile, char *argv1, char*argv2, .... , (char*)0); int execv(char *pathfile, char *argv[]);
int execl(const char *path, char *arg, ...(char*)0),;
int execlp(const char *file, char *arg, ...);
int execle(const char *path, char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
練習問題:
1
、
exec
プロセス起動出力「....」
sleep 2
秒、
fork
サブプロセスを生成し、サブプロセスが実行可能プログラムを呼び出す
main
、親プロセス出力"
father start
」、そして
sleep 3
秒、出力"
father over
”;
main
プログラム出力がメイン関数に渡されるパラメータ.
詳細:
親プロセスのパス
fork
子プロセスを生成します.子プロセスが親プロセスからコピーされた場合、子プロセスが呼び出されます.
exec
自分自身を新しいプログラムで置き換える.サブプロセスが親プロセスをコピーするプロセスは無駄です.
書き込み時コピー技術:
fork
サブプロセスが生成されると、親プロセスは完全にコピーされません.カーネルは親プロセスのすべてのスペースを読み取り専用に設定し、親子プロセスはこれらのスペースを共有します.親子プロセスのいずれかのプロセスがデータを変更しようとすると、カーネルはデータが存在するページを全体的にコピーします.
コード//
#include
#include
#include
#include
#include
#include
void sig_fun(int sign)
{
printf("sig_fun start %d
", sign);
int i = 0;
for(; i < 10; ++i)
{
sleep(1);
printf("sig_fun running
");
}
printf("sig_fun end
");
signal(sign, SIG_DFL);
}
void main()
{
signal(SIGINT, sig_fun);
signal(SIGTERM, sig_fun);
while(1)
{
sleep(2);
printf("main running
");
}
}
プロセス置換:
exec
一連の関数がプロセスに置き換えられる方法:実行中のプロセスは、ディスクに格納されたプログラム(実行可能ファイル)を使用して何らかの方法で実行されます.
オーバーライド(Override)
元のプロセスのすべての命令とデータ.
int execl(char *pathfile, char *argv1, char*argv2, .... , (char*)0); int execv(char *pathfile, char *argv[]);
int execl(const char *path, char *arg, ...(char*)0),;
int execlp(const char *file, char *arg, ...);
int execle(const char *path, char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
練習問題:
1
、
exec
プロセス起動出力「....」
sleep 2
秒、
fork
サブプロセスを生成し、サブプロセスが実行可能プログラムを呼び出す
main
、親プロセス出力"
father start
」、そして
sleep 3
秒、出力"
father over
”;
main
プログラム出力がメイン関数に渡されるパラメータ.
#include
#include
#include
#include
#include
void main()
{
printf("exec start
");
sleep(2);
printf("exec front pid == %d
", getpid());
execl("./mykill", "./mykill", (char *)0);
printf("exec finish
");
sleep(2);
printf("exec end
");
}
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
printf("mykill pid == %d
", getpid());
if(argc < 2)
{
printf("please input pid
");
exit(0);
}
//argv[1] = "1234";
int pid = 0;
sscanf(argv[1], "%d", &pid);
printf("pid == %d
", pid);
if(kill(pid, SIGCHLD) == -1)
{
perror(NULL);
exit(0);
}
}
詳細:
親プロセスのパス
fork
子プロセスを生成します.子プロセスが親プロセスからコピーされた場合、子プロセスが呼び出されます.
exec
自分自身を新しいプログラムで置き換える.サブプロセスが親プロセスをコピーするプロセスは無駄です.
書き込み時コピー技術:
fork
サブプロセスが生成されると、親プロセスは完全にコピーされません.カーネルは親プロセスのすべてのスペースを読み取り専用に設定し、親子プロセスはこれらのスペースを共有します.親子プロセスのいずれかのプロセスがデータを変更しようとすると、カーネルはデータが存在するページを全体的にコピーします.