Linux7.26 day10 exec 信号

系统调用:
文件描述符 open read write close

标准输入 0 stdin FILE*
标准输出 1 stdout
标准错误输出 2 stderr

struct file :
r,w,count,偏移量,pos,inode

exec 替换 进程
execl execlp execle execv execvp execve
库函数 系统调用

bash 命令解释器 fork + exec()
mybash 命令解释器
复制+替换 多用户系统
新进程 通过 fork+exec 实现

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc,char* argv[],char* envp)
{
    char* myargv[10] = {"ps","-f"};
    printf("main run pid = %d\n",getpid());
    // execl("/usr/bin/ps","ps","-f",(char*)0);  //执行成功不返回
    // execlp("ps","ps","-f",(char*)0);
    // execle("/usr/bin/ps","ps","-f",(char*)0,envp);

    // execv("/usr/bin/ps",myargv);  //参数放入数组
    // execvp("ps",myargv);
    
    execve("/usr/bin/ps",myargv,envp);  //系统调用内核中 内部最终形式

    printf("execl error");  //exec执行成功不返回 能运行到这步代表替换失败

    exit(0);
}

信号:通知进程产生了某种事件

系统调用 发送信号 kill() => 进程 => signal() 1 默认 2 忽略 3 自定义
收到信号(捕获) 响应(处理)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>

void fun_sig(int sig)  //信号处理函数
{
     printf("sig = %d\n",sig);  //sig=2   收到信号 打印信号代号
     //signal(sig,SIG_DFL);  //(3)自定义 收到该信号第一次打印信号代号 第二次恢复默认
}
int main(int argc,char* argv[],char* envp)
{
    signal(SIGINT,fun_sig);  //(1)发送信号告诉内核 当该程序收到sig=2信号(ctrl+c) 调用fun_sig函数  收到信号才执行
    //signal(SIGINT,SIG_IGN);  //(2)忽略该信号
    while(1)   //该程序一直循环无法退出
    {
         printf("hello\n");
         sleep(1);
    }
}

给进程发送信号

//   ./mykill    pid    sig
int main(int argc,char* argv[])
{
    if(argc != 3)
    {
         printf("ard err\n");
         exit(0);
    }
    int pid = 0;
    int sig = 0;

    sscanf(argv[1],"%d",&pid);
    sscanf(argv[2],"%d",&sig);

    if(kill(pid,sig) == -1)
    {
        perror("kill err");
    }
 
    exit(0);
}

父子进程 子进程结束 会给父进程发送信号 SIGCHLD

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <assert.h>
#include <sys/wait.h>

void fun_sig(int sig)
{
     printf("sig = %d\n",sig);  //收到信号子进程结束  子进程将变为僵死进程
     int val = 0;
     wait(&val);  //处理子进程  使其不变为僵死进程
}
int main()
{
    signal(SIGCHLD,fun_sig);  // (1)在信号处理函数中调用wait
    // signal(SIGCHLD,SIG_IGN); // (2)忽略子进程 只有Linux系统可以
    pid_t pid = fork();
    assert(pid != -1);

    if (pid == 0)
    {
        sleep(3);
        exit(0);
    }

    for(int i = 0 ; i < 5 ; i++)
    {
         printf("main run\n");
         sleep(1);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值