Linux学习03---信号 Shell

进程替换

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值