Linux中fork的进一步加深及信号基础

1.通过题目理解fork

    1.打印结果?产生了几个进程?

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

int main()
{
    int i=0;
    for(;i<2;i++)
    {
        fork();
        printf("A\n");
    }
    exit(0);
}

所以打印6个A;

2.如果改为printf("A"),打印结果?


3.打印结果?

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

int main()
{
     printf("A");
     fork();
     exit(0);
}

打印两个A,因为缓冲区里面有一个;

4.如果改为printf("A\n"),打印结果?

只打印一个A,因为已经打印了,缓冲区没有了;

5.打印结果?

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

int main()
{
    fork()||fork();
    printf("A\n");
    exit(0);
}

所以打印3个A;

6.第7行改为fork()&&fork之后打印结果是多少?

同理,注意短路现象即可;

所以打印3个A;

7.把第6题,第7题目的\n去掉影响结果不?

不影响;

因为是先fork,然后打印的时候放入缓冲区了,但是接着退出了,刷新缓冲区了,所以不影响;

8.打印结果?

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

int main()
{
    printf("A");
    write(1,"B",1);
    fork();
    exit(0);
}

先放入缓冲区,然后打印B,然后复制了一个子进程(子进程缓冲区也有一个A),然后父进程退出刷新缓冲区打印A,子进程也退出刷新缓冲区打印A;

所以结果是BAA;

9.第1题,第2题先打印再fork结果是什么?

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

int main()
{
    int i=0;
    for(;i<2;i++)
    {
        printf("A\n");
        fork();       
    }
    exit(0);
}

打印3个A;

i=0,打印A,然后fork;

之后i=1,打印A;                i=1,打印A

第二题先打印后fork:

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

int main()
{
    int i=0;
    for(;i<2;i++)
    {
        printf("A");
        fork();       
    }
    exit(0);
}

2.信号

(1)信号的基本介绍

信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作;
与信号有关的系统调用在<signal.h>头文件中.

1)信号的存储位置

vim    /usr/include/x86_64-linux-gnu/bits/signum.h   旧版

新版(23版)

vim    /usr/include/x86_64-linux-gnu/bits/signum-arch.h

vim    /usr/include/x86_64-linux-gnu/bits/signum-generic.h

2)常见信号对应的功能

SIGABORT       *进程异常终止

SIGALRM         超时警告

SIGFPE            *浮点运算异常

SIGHUP           连接挂断

SIGILL               *非法指令

SIGINT              终端中断

SIGKILL             终止进程(此信号不能被捕获或忽略)

SIGPIPE             向无读进程的管道写数据

SIGQUIT             终端退出

SIGSEGV             *无效内存段访问

SIGTERM               终止

SIGUSR1              用户定义信号1

SIGUSR2              用户定义信号2

...

3)信号的值

       信号名称 信号代号   

#define SIGHUP 1
#define SIGINT 2 //键盘按下 Ctrl+c 时,会产生终端中断信号
#define SIGQUIT 3//键盘按下 Ctrl+\ 时,会产生终端退出信号
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9 //该信号的响应方式不允许改变
#define SIGUSR1 10
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13 //读端关闭的描述符,写端写入时产生,该信号会终止程序(向无读进程的管道写数据)
#define SIGALRM 14
#define SIGTERM 15 //系统 kill 命令默认发送的信号
#define SIGSTKFLT 16
#define SIGCHLD 17 //子进程结束后,会默认给父进程发送该信号
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
           ...

(2)信号的响应方式

三种响应方式:默认,忽略,自定义;

演示默认的处理方式:

也就是收到信号了,进程按照信号默认的方式去处理;

代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <string.h>
int main()
{
    while(1)
    {
        printf("main run\n");
        sleep(1);
    }
    exit(0);
}

键盘按下ctrl+c时,其实就是因为该进程收到了一个信号:SIGNT----终端中断的信号.(2号信号);就是说,在键盘上按下ctrl+c时,会给当前终端前台执行的进程发送SIGINT信号;

(3)改变信号的响应方式

(1)设置信号的响应方式:通过系统调用signal();以下是对于signal中帮助手册的解释

man   signal

第二个参数为一个函数指针,它指向一个参数为int,返回值为void的一个函数;

(2)修改信号的响应方式

那如果我们改变信号的响应方式呢?

1)自定义

用signal修改SIGINT信号的响应方式示例如下

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

那如何结束该进程呢?

方法一:

打开另外一个终端,通过ps -ef|grep main这个命令找到该进程的pid,然后kill掉它.

方法二:

当然,我们也可以ctrl+\,这个是终端退出的信号;

2)忽略

将上面的signal函数代码修改成:
signal(SIGINT,SIG_IGN);

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

(4)信号练习题目:

收到SIGINT这个信号,第一次打印信号的代号,第二次按照默认形式把进程结束;

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/174964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西南科技大学电路分析基础实验A1(元件伏安特性测试 )

目录 一、实验目的 二、实验设备 三、预习内容(如:基本原理、电路图、计算值等) 1、测定线性电阻的伏安特性 2、二极管伏安特性测试 3、测定实际电压源的伏安特性 四、实验数据及结果分析(预习写必要实验步骤和表格) 1、测定线性电阻的伏安特性 2、二极管伏安特性测…

Linux环境配置Seata开机自启脚本(在MySQL和Nacos启动后启动)

之前给seata配置了一个开机启动脚本&#xff0c;但是经常出现启动失败&#xff0c;查询日志要么MySQL没有连接上要么nacos连接不上&#xff0c;原因都是因为服务器重启的时候这两个服务都还没有完全启动&#xff0c;所以正常的做法应该是启动前先等前置服务启动好了再启动seata…

大语言模型:以Amazon Titan等大语言模型为例介绍

大语言模型&#xff08;Large Language Model&#xff09;是一种人工智能技术&#xff0c;通过对海量文本数据进行训练&#xff0c;学习语言的结构、规则和语义&#xff0c;从而可以生成具有自然语言风格的文本或回答自然语言的问题。大语言模型一般基于神经网络技术&#xff0…

华为云CDN刷新与查询余量的Go实现及在Jenkins中的部署

引言 在华为云上&#xff0c;对CDN缓存内容进行刷新是一个常见的需求&#xff0c;以确保最新的内容能尽快被用户访问到。通过使用Go语言&#xff0c;我们可以开发一个自动化的工具来实现这一需求&#xff0c;并将其集成到Jenkins中以实现持续部署。下面我们将分步骤讲解如何实…

Bypass open_basedir的方法

文章目录 open_basedir概念绕过方法命令执行绕过symlink 绕过 &#xff08;软连接&#xff09;利用chdir()与ini_set()组合绕过 例题 [suctf 2019]easyweb open_basedir概念 open_basedir是php.ini的设置 在open_basedir设置路径的话 那么网站访问的时候 无法访问除了设置以外的…

KaiwuDB 亮相中国 5G + 工业互联网大会,助力新型工业化

11月19-21日&#xff0c;由各相关政府部门共同主办的“2023 中国 5G工业互联网大会”在湖北武汉盛大举行。作为我国“5G工业互联网”领域的国家级顶会&#xff0c;本届大会以“数实融合&#xff0c;大力推进新型工业化”为主题&#xff0c;聚焦新型基础设施、产业转型升级、技术…

笔记62:注意力汇聚 --- Nadaraya_Watson 核回归

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a a a a a a

【一维数组】交换数组

题目 将数组A中的内容和数组B中的内容进行交换。&#xff08;数组一样大&#xff09; 解题方式通过函数封装可以实现任意类型的数组元素交换 思路来源&#xff1a;qsort函数的模拟实现 void Change_arr2(void* ch1, void* ch2, size_t num, size_t sz) {for (int i 0; i < …

Docker配置Halo搭建个人博客-快速入门

Docker配置Halo搭建个人博客-快速入门 1 官方文档2 安装Halo2.1 创建Halo主目录2.2 远程下载配置文件2.3 编辑配置文件2.4 拉取最新镜像2.6 查看容器2.7 开放服务器的防火墙 3 运行3.1 运行项目3.2 停止项目 4 常见问题4.1 没有权限4.2 ommand netstart not found, did you mea…

8.0 泛型

通过之前的学习&#xff0c;读者可以了解到&#xff0c;把一个对象存入集合后&#xff0c;再次取出该对象时&#xff0c;该对象的编译类型就变成了Object类型&#xff08;尽管其在运行时类型没有改变&#xff09;。集合设计成这样&#xff0c;提高了它的通用性&#xff0c;但是…

Git的原理与使用(一):Git的基本操作(包含:版本回退)

Git原理与使用一 一.Git的初识与安装1.什么是Git2.如何安装Git1.git命令与git help(Git下的"man手册")2.centos下安装Git3.ubantu下安装Git 二.Git的前置操作与前置知识1.创建Git本地仓库2.配置Git3.理解Git的分区1.工作区2.暂存区3.版本库4.分区关系总结 三.添加文件…

springboot启动Table ‘xxx‘ already exists

jpa.generate-ddl和jpa.hibernate.ddl-auto都可以控制是否执行datasource.schema脚本&#xff0c;来初始化数据库结构&#xff0c;只要有一个为可执行状态就会执行&#xff0c;比如jpa.generate-ddl:true或jpa.generate-ddl:update&#xff0c;并没有相互制约上下级的关系。 要…

Android修行手册 - 使用ViewPager2实现画廊效果

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

小航助学题库蓝桥杯题库stem选拔赛(22年3月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

解决ansible批量加入新IP涉及known_hosts报错的问题

我们把一批新的IP加入到ansible的hosts文件&#xff0c;比如/etc/ansible/hosts&#xff0c;往往会有这样的提示&#xff0c; 因为本机的~/.ssh/known_hosts文件中并有fingerprint key串&#xff0c;使用ssh连接目标主机时&#xff0c;一般会提示是否将key字符串加入到~/.ssh/…

如何使用内网穿透将Tomcat网页发布到公共互联网上【内网穿透】

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…

中国北斗:守护萨雷兹湖一方安澜

中国北斗&#xff1a;守护萨雷兹湖一方安澜 在第三届“一带一路”国际合作高峰论坛数字经济高级别论坛上&#xff0c;由中国经济信息社、国家发展改革委高技术司、国家数据局联合编制的《数字“慧”就发展之路》中英文图文集正式发布&#xff0c;展现了中国与共建“一带一路”国…

PHP中关于func_get_args()方法

首先呢这个函数出现的是比较早的,大致应该是PHP4出现的, func_get_args — 返回一个包含函数参数列表的数组 说明 func_get_args(): array 获取函数参数列表的数组。 该函数可以配合 func_get_arg() 和 func_num_args() 一起使用&#xff0c;从而使得用户自定义函数可以接…

如何将mobi、awz3、epub格式转化为pdf

偶然之间有个需求就是网上下载了一些书籍的格式没法打开看&#xff0c;或者是想把kindle的书籍转换成pdf 那么经过一番折腾找到了两个可以用的工具站分享给大家&#xff0c;有需要的可是尝试下&#xff0c;小编这边测试了可以用&#xff0c;就是下载的时候慢的一匹。。。 第一…

PHP 双门双向门禁控制板实时监控源码

本示例使用设备&#xff1a; 实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) <?PHPheader("content-type:text/html;charsetGBK");$ThisIpget_local_ip(); //获取电脑IP地址 $server udp://.$ThisIp.:39192; $sock…