进程替换
exec系列方法 库函数: execl execlp execle execv execvp ->系统调用: execve
替换过程中PCD是保留的,main方法成功执行exec(ps)后不返回main直接运行ps
fork+exec 是linux创建新进程的方式
内存申请malloc: 申请1G -> 剩余内存(物理内存+虚拟内存)是否够用
申请3G -> 不能成功,虚拟进程地址空间 3G为用户可使用,但除了堆还有其他存放内容
信号
发送信号kill()给某个进程(当该进程产生了某种事件),该进程接收信号响应信号signal()
kill(pid, sig)
sig:信号代号
信号的相应方式
signal() 三种方式:默认(SIG_DFL) 忽略(SIG_IGN) 自定义(void fun(int sig))
void fun_sig(int sig){
printf("sig = %d \n", sig);
signal(sig, SIG_DFL); // SIG_DFL 函数地址强转 -> (void(*p)(int)) 0
}
int main(){
signal(SIGINT, fun_sig); //自定义 函数名 fun_sig == &fun_sig
// 执行signal后 没有立刻执行fun_sig函数,等接收到了SIGINT2号信号之后,内核才会去调用fun_sig
// 提前定义好响应信号,然后等待信号产生,信号产生之后用定义好的方式响应就好
// signal(SIGINT, SIG_IGN); // 忽略 (SIG_IGN 宏) // (void(*p)(int)) 1
// 默认方式 : 直接删掉signal语句
while(1){ //在执行到while循环后,进程接收到信号,进程会被挂起,内核会去执行信号
printf("main run \n");
sleep(1);
}
}
程序在前台运行时,可以ctrl+c将其结束
程序在后台运行时,ctrl+c不能将其结束,可以使用 kill + 进程的pid 结束进程
发送信号
mykill.c向目标程序(main.c)发送信号
// 发送信号
// ./mykill 12345(该进程的pid) 2(信号代号).
// argc 3 argv[0] = "./mykill", argv[1] = "12345", argv[2] = "2"
int main(int argc, char* argv[]){
if( argc != 3 ){
printf("srg err\n");
exit(0);
}
int pid = 0;
int sig = 0;
sscanf(argv[1], "%d", &pid);
sscanf(argv[2], "%d", &sig);
if( kill(pid,SIGINT) == -1 ){
printf("kill err \n");
}
exit(0);
}
SIGKILL 9 该信号不允许做出改变
shell: bash mybash