1 基本功能

本Blog创建了两个进程(父子进程):

  • 父进程

    执行文本复制操作,当收到 SIGUSR1信号后,打印出现在文件复制的进度;
  • 子进程

    每个固定时间段向父进程发送一个 SIGUSR1 信号。

2 代码示例

/*
* File: Signal.c
*Description: Two process
1. Father: copy a file, when receive the SIGUSR1 signal, print the progress
2. Child: timing trigger the parent process
*Autor: Jimmy Nie
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <sys/fcntl.h> void handler(int sig);
void SigAlarm(int sig); int count = 0; //has read bytes
int fileSize = 0; //the source file size int main(int argc, char *argv[])
{
//variable define
int fd_src, fd_dst;
int tmp = 0; //how many bytes read every time
char buf[128] ; //tempature storage buffer //0. check the argument
if(argc != 3)
{
printf("%s(%d): Check the arguments, argument=%d(3 is need)\n", argc);
exit(EXIT_FAILURE);
} //1. open the file
if(-1 == (fd_src=open(argv[1], O_RDONLY)))
{
perror("open");
exit(EXIT_FAILURE);
} //open the destination file, if it does not exist, creat it first
if(-1 == (fd_dst=open(argv[2], O_RDWR|O_CREAT, 0644)))
{
perror("open");
exit(EXIT_FAILURE);
} //2. Obtain the source file size
fileSize = lseek(fd_src, 0, SEEK_END);
if(fileSize < 0)
{
perror("lseek");
exit(EXIT_FAILURE);
} lseek(fd_src, 0, SEEK_SET); //3. Father process install SIGUSR1 signal
if(signal(SIGUSR1, handler) == SIG_ERR)
{
perror("signal");
exit(EXIT_FAILURE);
} //4. Creat a new process(child)
pid_t pid;
if(-1 == (pid=fork()))
{
perror("fork");
exit(EXIT_FAILURE);
} //In child process
else if(pid == 0)
{
//Install the signal SIGALRM
if(signal(SIGALRM, SigAlarm) == SIG_ERR)
{
perror("signal");
exit(EXIT_FAILURE);
} ualarm(200,10000); //after 20ms start trigger, and every 50ms trigger once
//alarm(1); while(1) //execute continues
;
} //In parent process
else
{
//3. copy source file to destination file
while(1)
{
//read the source file to buf
if(-1 == (tmp=(read(fd_src, buf, 128))))
{
perror("read");
exit(EXIT_FAILURE);
} //check the end of file
if(0 == tmp)
{
printf("Finished copy the file, and file size:%d\n", fileSize);
kill(pid, SIGINT); //finished copy, trigger a signal to child, and terminate child process
break;
} //write the buffer to the destination file
if(-1 == write(fd_dst, buf, tmp))
{
perror("Write");
exit(EXIT_FAILURE);
} count += tmp;
} wait(NULL); //wait child process exit
close(fd_src);
close(fd_dst);
} return 0;
} //function used to print the progree of copy file
void handler(int sig)
{
int i = 0;
i = (int)(((float)count / (float)fileSize) * 100);
printf("\nHas copyed %d%% \n",i); int j = 0;
for(j=0; j<i; j++)
{
if(j%2)
printf("*");
} printf("\n");
} //used to send SIGUSR1 signal to parent process
void SigAlarm(int sig)
{
kill(getppid(), SIGUSR1);
//alarm(1);
}

编译该代码:


[root@niesh Linux]# gcc -o signal signal.c
[root@niesh Linux]# ll
总用量 36
-rwxrwxr-x. 1 niesh niesh 8659 9月 22 22:07 produce
-rw-rw-r--. 1 root niesh 467 9月 22 22:07 produce.c
-rwxr-xr-x. 1 root root 13445 9月 23 11:26 signal
-rw-rw-r--. 1 root niesh 3407 9月 22 22:45 signal.c

但是此时我们还需要一个大于1M的ASCII文件,使得CP不至于瞬间完成:

#include <stdio.h>
#include <sys/fcntl.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h> int main(int argc, char *argv[])
{
int fd;
int count = 0;
char buf[] = "Hello,world\n"; fd = open(argv[1], O_RDWR|O_CREAT, 0644); for(count=0; count < 1024*1024; count++)
write(fd, buf, strlen(buf)); //file size = 16*256*1024*1024 = 4Mbyte //printf("The sizeof(buf)=%d\n",sizeof(buf));
close(fd); return 0;
}

通过以上代码我们可以产生出一个12M的文本文件:


[root@niesh Linux]# gcc -o produce produce.c
[root@niesh Linux]# ./produce test
[root@niesh Linux]# ll -h
总用量 13M
-rwxr-xr-x. 1 root root 8.5K 9月 23 11:31 produce
-rw-rw-r--. 1 root niesh 467 9月 22 22:07 produce.c
-rwxr-xr-x. 1 root root 14K 9月 23 11:26 signal
-rw-rw-r--. 1 root niesh 3.4K 9月 22 22:45 signal.c
-rw-r--r--. 1 root root 12M 9月 23 11:31 test //ASCII文件 12M

3 执行效果


[root@niesh Linux]# ./signal test t1 Has copyed 1% Has copyed 3%
* Has copyed 6%
*** Has copyed 7%
*** Has copyed 9%
**** Has copyed 10%
***** Has copyed 15%
******* Has copyed 21%
********** Has copyed 25%
************ Has copyed 29%
************** Has copyed 34%
***************** Has copyed 42%
********************* Has copyed 44%
********************** Has copyed 48%
************************ Has copyed 54%
*************************** Has copyed 58%
***************************** Has copyed 65%
******************************** Has copyed 71%
*********************************** Has copyed 76%
************************************** Has copyed 80%
**************************************** Has copyed 88%
******************************************** Has copyed 93%
********************************************** Has copyed 97%
************************************************
Finished copy the file, and file size:12582912

查看复制后的结果:


[root@niesh Linux]# ll -h
总用量 25M
-rwxr-xr-x. 1 root root 8.5K 9月 23 11:31 produce
-rw-rw-r--. 1 root niesh 467 9月 22 22:07 produce.c
-rwxr-xr-x. 1 root root 14K 9月 23 11:26 signal
-rw-rw-r--. 1 root niesh 3.4K 9月 22 22:45 signal.c
-rw-r--r--. 1 root root 12M 9月 23 11:42 t1 //复制后生成的文件
-rw-r--r--. 1 root root 12M 9月 23 11:31 test

Linux信号机制代码示例的更多相关文章

  1. Linux信号机制

    Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...

  2. 利用linux信号机制调试段错误(Segment fault)

    在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...

  3. 利用linux信号机制调试段错误(Segment fault)【转】

    转自:http://blog.csdn.net/ab198604/article/details/6164517 版权声明:本文为博主原创文章,未经博主允许不得转载. 在实际开发过程中,大家可能会遇到 ...

  4. linux信号机制与python信号量

    1.信号本质 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是进程间 ...

  5. xenomai内核解析之信号signal(一)---Linux信号机制

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 目录 1. Linux信号 1.1注册信号处理函数 ...

  6. linux信号机制 - 用户堆栈和内核堆栈的变化【转】

    转自:http://itindex.net/detail/16418-linux-%E4%BF%A1%E5%8F%B7-%E5%A0%86%E6%A0%88 此文只简单分析发送信号给用户程序后,用户堆 ...

  7. linux 信号机制

    文章目录 1. 实时信号非实时信号 2. 信号状态: 3. 信号生命周期: 4. 信号的执行和注销 信号掩码和信号处理函数的继承 信号处理函数的继承 信号掩码的继承 sigwait 与多线程 sigw ...

  8. Storm入门(七)可靠性机制代码示例

    一.关联代码 使用maven,代码如下. pom.xml  参考 http://www.cnblogs.com/hd3013779515/p/6970551.html MessageTopology. ...

  9. Linux信号(signal) 机制分析

    Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...

随机推荐

  1. [翻译]ASP.NET Web API 2 中的全局错误处理

    目录 已存在的选项 解决方案预览 设计原则 什么时候去用 方案详情 示例 附录: 基类详情 原文链接 Global Error Handling in ASP.NET Web API 2 由于翻译水平 ...

  2. C# 标准事件模式

    .NET框架为事件定义了一个标准模式,它的目的是保持框架和用户代码之间的一致性. 标准事件的模式核心是SystemEventArgs——预定义的没有成员的框架类(不同于静态Empty属性) Event ...

  3. SHT20 IIC总线驱动概述

    SHT20温湿度传感器使用iic总线的驱动方式,以下资料参考SHT20 datasheet总结 1.IIC总线 Start信号 IIC总线的起始信号以SDA由高电平变为低电平,等待5us以上,再由SC ...

  4. Interesting JavaScript

    作者:ManfredHu 链接:http://www.manfredhu.com/2016/07/07/20-interestingJavascript 声明:版权所有,转载请保留本段信息,否则请不要 ...

  5. flume在windows环境下的使用

     Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理, ...

  6. Code Chef DARTSEGM(计算几何+凸包)

    题面 传送门 题解 好眼熟丫-- 一月月赛最后一题--,代码都不用改-- //minamoto #include<bits/stdc++.h> #define R register #de ...

  7. jQuery基础笔记(2)

    day54 筛选器 参考:https://www.cnblogs.com/liwenzhou/p/8178806.html#autoid-1-7-5 筛选器方法 下一个元素: $("#id& ...

  8. Xshell多版本被曝存在后门,了解紧急响应修复预案

    近日,Xshell远程终端工具被爆出多个版本存在后门,无疑是安全圈的一个大新闻.恶意攻击者利用该后门可以收集到用户名密码等主机敏感信息,并将之传回攻击者的机器,导致服务器信息泄露,进一步可致使整个服务 ...

  9. Centos之文件搜索命令find

    find [搜索范围] [搜索条件] #搜索文件 find / -name install.log #避免大范围搜索,会非常耗费系统资源 #find是在系统当中搜索符合条件的文件名.如果需要匹配, 使 ...

  10. 《JAVA与模式》之原型模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办 ...