Linux Day09

这篇具有很好参考价值的文章主要介绍了Linux Day09。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、进程替换

二、Linux信号的使用

2.1  kill() 发送信号

2.2  signal() 改变进程对信号的响应方式

2.3 处理僵死进程

2.3.1 在信号处理函数中调用wait

2.3.2  Linux特有的

2.3.3 结果


一、进程替换

linux上创造一个新进程,没有create创建方法,而是通过fork+exec系列,先将进程复制一份,将子进程替换成另外一个进程,这样就相当于创建一个进程

Linux Day09,linux,运维,服务器

 ps -f和bash没有任何关系,为什么ps -f的父进程是bash,因为bash将自己复制了一份,然后将ps -f替换了它的子进程,从而有了创造了该指令。

#include <unistd.h>
exec 系类方法介绍以 execl 为例:
  /*
*path:新替换的程序的路径名称
*arg :传给新程序主函数的第一个参数,一般为程序的名字
*arg 后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数
*/
i nt execl( const char * path, const char * arg,...);
int execlp( const char * file, const char * arg,...);
int execle( const char * path, const char * arg,..., char * const envp[]);
  int execv( const char * path, char * const argv[]);
int execvp( const char * file, char * const argv[]);
int execve( const char * path, char * const argv[], char * const envp[]);
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<unistd.h>
#include<string.h>
#include <sys/wait.h>
int main(int agrc,char*argv[],char*envp[]){
    printf("main pid=%d,ppid=%d\n",getpid(),getppid());
    pid_t pid=fork();
    assert(pid!=-1);
    if(pid==0)
    {
        printf("child pid=%d,ppid=%d\n",getpid(),getppid());
        char*myenvp[10]={"MYSTR=hello"};
        execl("/bin/ps","ps","-f",(char*)0);
        execlp("ps","ps","-f",(char*)0);
        execle("/usr/bin/ps","ps","-f",(char*)0,myenvp);

        char* myargv[]={"ps","-f",0};
        execv("/usr/bin/ps",myargv);
        execvp("ps",myargv);
        execve("/usr/bin/ps",myargv,envp);
        printf("execl error");
        exit(0);
    }
    wait(NULL);
    exit(0);
}

结果

Linux Day09,linux,运维,服务器

二、Linux信号的使用

信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。
信号的值在系统源码中的定义如下:
1. #define SIGHUP 1
2. #define SIGINT 2 //键盘按下 Ctrl+c 时,会产生该信号
3. #define SIGQUIT 3
4. #define SIGILL 4
5. #define SIGTRAP 5
6. #define SIGABRT 6
7. #define SIGIOT 6
8. #define SIGBUS 7
9. #define SIGFPE 8
10. #define SIGKILL 9 //该信号的响应方式不允许改变
11. #define SIGUSR1 10
12. #define SIGSEGV 11
13. #define SIGUSR2 12
14. #define SIGPIPE 13 //读端关闭的描述符,写端写入时产生,该信
号会终止程序
15. #define SIGALRM 14
16. #define SIGTERM 15 //系统 kill 命令默认发送的信号
17. #define SIGSTKFLT 16
18. #define SIGCHLD 17 //子进程结束后,会默认给父进程发送该信
19. #define SIGCONT 18
20. #define SIGSTOP 19
21. #define SIGTSTP 20
22. #define SIGTTIN 21
23. #define SIGTTOU 22
24. #define SIGURG 23

2.1  kill() 发送信号

kill() 可以向指定的进程发送指定的信号:
int kill(pid_t pid, int sig);
pid > 0 指定将信号发送个那个进程
pid == 0 信号被发送到和当前进程在同一个进程组的进程
pid == -1 将信号发送给系统上有权限发送的所有的进程
pid < -1 将信号发送给进程组 id 等于 pid 绝对值,并且有权限发送的所有的进程。
sig 指定发送信号的类型。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<unistd.h>
#include<string.h>
#include<signal.h>
int main(int argc,char*argv[])
{
    if(argc!=3)
    {
        printf("argc err\n");
        exit(1);
    }
    int pid=atoi(argv[1]);
    int sig=atoi(argv[2]);
    if(kill(pid,sig)==-1)
    {
        printf("kill err\n");
    }
    exit(0);
}

2.2  signal() 改变进程对信号的响应方式

Linux Day09,linux,运维,服务器

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>
void fun_sig(int sig){
    printf("sig=%d",sig);
}
int main(){
    signal(SIGINT,fun_sig);
    while(1){
        printf("main run\n");
        sleep(1);
    }
    exit(0);
}

 结果:

Linux Day09,linux,运维,服务器

ctrl+c的信号值为2,与内核达成协议,当有ctrl+c时执行fun_sig()函数。

如果想要结束该进程 :

1.新建一个窗口,查看该进程编号,结束该进程

Linux Day09,linux,运维,服务器

2.Ctrl +/

 signal(SIGINT,SIG_IGN);忽略 ,如果再ctrl+c,系统不会终止,会继续执行

signal(SIGINT,SIG_DFL);默认,如果再ctrl+c,系统终止

signal(SIGINT,fun_sig);

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>
void fun_sig(int sig){
    printf("sig=%d\n",sig);
    signal(sig,SIG_DFL);
}
int main(){
   // signal(sig,SIG_DFL);//默认
   // signal(sig,SIG_IGN);//忽略
    signal(SIGINT,fun_sig);//自定义
    while(1){
        printf("main run\n");
        sleep(1);
    }
    exit(0);
}

结果

Linux Day09,linux,运维,服务器

当第一次使用ctrl+c时,调用自定义函数,返回该信号的值,第二次使用ctrl+c调用系统默认的,结束了该进程。

2.3 处理僵死进程

2.3.1 在信号处理函数中调用wait

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<signal.h>
#include<sys/wait.h>
void fun_sig(int sig)
{
    printf("sig=%d\n",sig);
    wait(NULL);
}
int main()
{
    char*s=NULL;
    int n=0;
    signal(SIGCHLD,fun_sig);
    pid_t pid=fork();
    if(pid==-1){
        exit(1);
    }
    if(pid==0)
    {
        s="child";
        n=3;
    }
    else
    {
        s="parent";
        n=7;
    }
    int i=0;
    for(;i<n;i++){
        printf("s=%s,pid=%d\n",s,getpid());
        sleep(1);
    }
    exit(0);

}

2.3.2  Linux特有的

signal(SIGCHLD,SIG_IGN);

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<signal.h>
#include<sys/wait.h>
void fun_sig(int sig)
{
    printf("sig=%d\n",sig);
    wait(NULL);
}
int main()
{
    char*s=NULL;
    int n=0;
    signal(SIGCHLD,SIG_IGN);
    pid_t pid=fork();
    if(pid==-1){
        exit(1);
    }
    if(pid==0)
    {
        s="child";
        n=3;
    }
    else
    {
        s="parent";
        n=7;
    }
    int i=0;
    for(;i<n;i++){
        printf("s=%s,pid=%d\n",s,getpid());
        sleep(1);
    }
    exit(0);

}

2.3.3 结果

Linux Day09,linux,运维,服务器文章来源地址https://www.toymoban.com/news/detail-658184.html

到了这里,关于Linux Day09的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux本地部署1Panel服务器运维管理面板并实现公网访问

    1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等 下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理界面 执行如下命令一键安装 1Panel: 安

    2024年02月04日
    浏览(58)
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程,本期为大家按照本专栏的基本内容进行多方面的测评。

    2024年02月07日
    浏览(73)
  • C++linux高并发服务器项目实践 day4

    int access(const char * pathname ,int mode); int chmod(const char * filename,int mode); int chown(const char* path,uid_t owner,gid_t group); int truncate(const char* path,off_t length); #include unistd.h int access(const char *pathname, int mode); 作用:判断某个文件是否有某个权限,或者判断文件是否存在 参数: pathname:判断文件路

    2023年04月16日
    浏览(30)
  • C++linux高并发服务器项目实践 day5

    程序 是包含一系列信息的文件,这些信息描述了如何在运行时创建一个进程: 程序是文件,只占用硬盘的大小;进程会占用cpu和内存资源 进程 是正在运行的程序的实例。是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。他是操作系统动态执行的基本单元,

    2023年04月17日
    浏览(28)
  • C++linux高并发服务器项目实践 day2

    库的定义和特点详情请看隔壁c++阶段学习的day10查看 Linux: libxxx.a lib:固定前缀 xxx:库的名字,自定义 .a:固定后缀 windows:libxxx.lib gcc获得.o文件 将.o文件打包,使用ar工具(archive) ar rcs libxxx.a xxx.o xxx.o r- 将文件插入备存文件中 c-建立备存文件 s-索引 sudo apt install tree 安装tree插件,用

    2023年04月20日
    浏览(27)
  • Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月02日
    浏览(39)
  • 华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

    本章节内容,我们主要介绍华为云耀服务器L实例,从云服务的优势讲起,然后讲解华为云耀服务器L实例资源面板如何操作,如何使用宝塔运维服务,如何使用运维工具可视化安装nginx,最后部署一个自研的H5的小游戏(6岁的小朋友玩的很开心😁)。 前端的同学如果想把自己

    2024年02月07日
    浏览(46)
  • linux 15day apache apache服务安装 httpd服务器 安装虚拟主机系统 一个主机 多个域名如何绑定

    1.apache目录介绍 1.准备测试页面 2.访问控制测试 可以直接编辑apache主配置文件 修改默认网站发布目录 配置域名解析: 测试访问 基于端口 访问:www.soso666.com 访问: test.soso666.com:81 可以配置域名解析,也可以不用配域名解析

    2024年02月04日
    浏览(41)
  • linux 17day 堡垒机 堡垒机下载 堡垒机安装 堡垒机使用 堡垒机管理服务器 堡垒机管理数据库

    https://jumpserver.org/ 没有注册的需要注册一个账号 即可下载 配置站点url 配置邮箱 创建要管理的服务器 现在还不能 管理 因为还没有配置用户名和密码 创建 特权用户用于管理 创建普通用户 添加命令过滤 命令过滤创建好 之后就需要 给用户名 和管理添加 管理用户也是一样的

    2024年02月20日
    浏览(33)
  • day-08 基于Linux的网络编程(套接字和标准I/O、分离I/O流、epoll、多线程服务器)

    标准I/O函数(stdio)是在C语言中用于进行输入和输出操作的库函数 。它们包括了一组标准的输入和输出函数,如printf、scanf、fopen、fclose等。标准I/O函数具有以下优点: 简单易用 :标准I/O函数提供了简洁的接口,使得输入和输出操作变得简单易用。开发人员无需自行处理底层

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包