linux-プロセス置換

2885 ワード

プロセスにSIGINT信号を送信する場合、プロセスの信号処理関数は終了するまで10秒かかり、その後10秒以内にSIGINT信号を送信し、プロセスが実行される場合.1、2回目の信号が1回目と違うとしたら??2、信号処理関数はできるだけ速くする必要がある.
コード//
#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
サブプロセスが生成されると、親プロセスは完全にコピーされません.カーネルは親プロセスのすべてのスペースを読み取り専用に設定し、親子プロセスはこれらのスペースを共有します.親子プロセスのいずれかのプロセスがデータを変更しようとすると、カーネルはデータが存在するページを全体的にコピーします.