Linux编程:时间与文件及信号的操作

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
void fun(int x)
{
 printf("hello world!\r\n");
 int i;
 FILE *f=fopen("a.txt","rw+");
 if(f==NULL)
{printf("file error\r\n");
  exit(-1);};
 for(i=0;i<10;i++)
 {
  time_t a=time(NULL);
  printf("%s\r\n",ctime(&a));
  //功 能: 把日期和时间转换为字符串
  //用 法: char *ctime(const time_t *time);
  fprintf(f,"%s\r\n",ctime(&a));

  struct tm *gmt;
  gmt = gmtime(&a);
     printf("%d/%d/%d  %d:%d:%d %d\r\n",gmt->tm_year+1900,gmt->tm_mon+1,gmt->tm_mday ,gmt->tm_hour,gmt->tm_min,gmt->tm_sec,gmt->tm_wday+1);
     fprintf(f,"%d/%d/%d  %d:%d:%d %d\r\n\n",gmt->tm_year+1900,gmt->tm_mon+1,gmt->tm_mday ,gmt->tm_hour,gmt->tm_min,gmt->tm_sec,gmt->tm_wday+1);
  sleep(2);
 }
 fclose(f);
 exit(1);
}
int main()
{
 signal(SIGINT,fun);
 while(1);
}

表头文件#include<signal.h>

功 能:设置某一信号的对应动作

函数原型:void (*signal(int signum,void(* handler)(int)))(int);

或者:typedef void(*sig_t) ( int );

sig_t signal(int signum,sig_t handler);

参数说明:

第一个参数signum指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。

第二个参数handler描述了与信号关联的动作,它可以取以下三种值:

(1)一个无返回值的函数地址

此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为sig的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义:

void func(int sig);

sig是传递给它的唯一参数。执行了signal()调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行func()函数。当func()函数执行结束后,控制权返回进程被中断的那一点继续执行。

(2)SIG_IGN

这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。

(3)SIG_DFL

这个符号表示恢复系统对信号的默认处理。

函数说明:

signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。当一个信号的信号处理函数执行时,如果进程又接收到了该信号,该信号会自动被储存而不会中断信号处理函数的执行,直到信号处理函数执行完毕再重新调用相应的处理函数。但是如果在信号处理函数执行时进程收到了其它类型的信号,该函数的执行就会被中断。

返回值:返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。

下面的情况可以产生Signal:

按下CTRL+C产生SIGINT

硬件中断,如除0,非法内存访问(SIGSEV)等等

Kill函数可以对进程发送Signal

Kill命令。实际上是对Kill函数的一个包装

软件中断。如当Alarm Clock超时(SIGURG),当Reader中止之后又向管道写数据(SIGPIPE),等等

程序例:

This example installs a signal handler routine for SIGFPE,catches an integer overflow condition, makes an adjustment to AX register, and returns. This example program MAY cause your computer to crash, and will produce runtime errors depending on which memory model is used.

#pragma inline
#include <stdio.h>
#include <signal.h>
void Catcher(int sig, int type, int *reglist)
{
printf("Caught it!\n");
*(reglist + 8) = 3; // make return AX = 3
}
int main(void)
{
signal(SIGFPE, Catcher);
asm mov ax,07FFFH
// AX = 32767
asm inc ax

// cause overflow
asm into
// activate handler
The handler set AX to 3 on return. If that hadn't happened,
there would have been another exception when the next 'into'
was executed after the 'dec' instruction.
asm dec ax
// no overflow now
asm into
// doesn't activate
return 0;
}

2 Signals:

Signal

Description

SIGABRT

由调用abort函数产生,进程非正常退出

SIGALRM

用alarm函数设置的timer超时或setitimer函数设置的interval timer超时

SIGBUS

某种特定的硬件异常,通常由内存访问引起

SIGCANCEL

由Solaris Thread Library内部使用,通常不会使用

SIGCHLD

进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略

SIGCONT

当被stop的进程恢复运行的时候,自动发送

SIGEMT

和实现相关的硬件异常

SIGFPE

数学相关的异常,如被0除,浮点溢出,等等

SIGFREEZE

Solaris专用,Hiberate或者Suspended时候发送

SIGHUP

发送给具有Terminal的Controlling Process,当terminal被disconnect时候发送

SIGILL

非法指令异常

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/Linux/

SIGINFO

BSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程

SIGINT

由Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程

SIGIO

异步IO事件

SIGIOT

实现相关的硬件异常,一般对应SIGABRT

SIGKILL

无法处理和忽略。中止某个进程

SIGLWP

由Solaris Thread Libray内部使用

SIGPIPE

在reader中止之后写Pipe的时候发送

SIGPOLL

当某个事件发送给Pollable Device的时候发送

SIGPROF

Setitimer指定的Profiling Interval Timer所产生

SIGPWR

和系统相关。和UPS相关。

SIGQUIT

输入Quit Key的时候(CTRL+\)发送给所有Foreground Group的进程

SIGSEGV

非法内存访问

SIGSTKFLT

Linux专用,数学协处理器的栈异常

SIGSTOP

中止进程。无法处理和忽略。

SIGSYS

非法系统调用

SIGTERM

请求中止进程,kill命令缺省发送

SIGTHAW

Solaris专用,从Suspend恢复时候发送

SIGTRAP

实现相关的硬件异常。一般是调试异常

SIGTSTP

Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程

SIGTTIN

当Background Group的进程尝试读取Terminal的时候发送

SIGTTOU

当Background Group的进程尝试写Terminal的时候发送

SIGURG

当out-of-band data接收的时候可能发送

SIGUSR1

用户自定义signal 1

SIGUSR2

用户自定义signal 2

SIGVTALRM

setitimer函数设置的Virtual Interval Timer超时的时候

SIGWAITING

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, include
, 进程
, handler
, 信号
, signal
sig文件
,以便于您获取更多的相关知识。

时间: 2024-10-01 22:44:59

Linux编程:时间与文件及信号的操作的相关文章

Linux编程实现制作文件的ed2k链_C 语言

本程序依赖 c99, 只支持终端"标准输入",转换成的链接以"标准输出"而输出,错误以"标出错误输出"而输出. md4 编码代码来自网络. 编译命令:gcc -std=c99 -o ed2k md4.c  ed2k.c  utils.c 用户命令:ed2k <File...> 产生的链是最简短的形式:ed2k://|file|<FileName>|<FileSize>|<FileHash>|/ c+

Linux网络编程 epoll中EPOLLIN EPOLLOUT信号无法触发

问题描述 Linux网络编程 epoll中EPOLLIN EPOLLOUT信号无法触发 比如 if(events[i].events&EPOLLIN) { int bytes_read=read(m_sockfd,read_buf,READ_BUFFER_SIZE); } 这样会触发EPOLLIN 但如果把read()封装到比如service类的sread()函数中 if(events[i].events&EPOLLIN) { service.sread() } 便不会触发EPOLLIN事

linux下基于C语言的信号编程实例_C 语言

本文实例讲述了linux下基于C语言的信号编程方法.分享给大家供大家参考.具体如下: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void sig_handler(int sig_no, siginfo_t *info, void *ctext){ printf("receive si

编程 批处理-bat程序,根据系统时间开放文件夹权限,并且删除相应内容

问题描述 bat程序,根据系统时间开放文件夹权限,并且删除相应内容 有十二个文件夹,用英语的十二个月命名.根据系统的时间开放对应的本月,上个月,下个月,这三个月文件夹,可读可写.其他文件夹除管理员以外,都是拒绝访问的,并且其中的内容全部删除.例如,现在是九月,开放的就是,八月,九月,十月这三个月文件夹,可读,可写.除了这三个文件夹 除了管理员,其他人都是拒绝访问,并且情况文件夹(删除文件夹子目录内容,保留月份文件夹不变.不是全部删除后,再创建). 大神们,帮帮小弟吧,,,

linux下,如何用shell实现 删除创建时间超过指定时间的文件?

问题描述 请问下如何用shell实现删除指定创建时间的文件?如,我想删除创建时间超过N小时的缓存文件,这个shell该如何写呢?谢谢! 问题补充:hao117 写道 解决方案 find . -name "backup_*.gz" -mtime +7 -exec rm {} ;n小时创建把-mtime +7 改为-cmin n -amin n 查找系统中最后N分钟访问的文件 -atime n 查找系统中最后n*24小时访问的文件 -cmin n 查找系统中最后N分钟被改变状态的文件 -c

linux编程-如何简化一下shell文件处理过程

问题描述 如何简化一下shell文件处理过程 cd txt filelist=`ls` for file in $filelist do >temp.txt echo $file cat $file | uniq >> temp.txt >$file cat temp.txt >> $file done 如上面代码所示:功能需求是将该目录下所有文件进行cat uniq操作之后保存回该文件,我使用了temp.txt,不知道有没有可以直接写回文件的命令?请指导! 解决方案

[综合面试] 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

感谢IT面试群 S-北京-陈磊 的整理分享. 基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会写生产者.消费者问题,完全消化理解) 5. 线程的实现方式. (也就是用户线程与内核线程的区别) 6. 用户态和核心态的区别. 7. 用户栈和内核栈的区别. 8. 内存池.进程池.线程池.(c++程序员必须掌握) 9. 死锁的概念,导致死锁的原因. 10

点评五款用于 Linux 编程的内存调试器

点评五款用于 Linux 编程的内存调试器 Credit: Moini 作为一个程序员,我知道我肯定会犯错误--怎么可能不犯错!程序员也是人啊.有的错误能在编码过程中及时发现,而有些却得等到软件测试了才能显露出来.然而,还有一类错误并不能在这两个阶段被解决,这就导致软件不能正常运行,甚至是提前终止. 如果你还没猜出是那种错误,我说的就是和内存相关的错误.手动调试这些错误不仅耗时,而且很难发现并纠正.值得一提的是,这种错误很常见,特别是在用 C/C++ 这类允许手动管理内存的语言编写的软件里. 幸

《Linux系统编程(第2版)》——1.4 Linux编程的概念

1.4 Linux编程的概念 本节给出了Linux系统提供的服务的简要概述.所有的UNIX系统,包括Linux,提供了共同的抽象和接口集合.实际上,UNIX本身就是由这些共性定义的,比如对文件和进程的抽象.管道和socket的管理接口等等,都构成了UNIX系统的核心. 本概述假定你对Linux环境很熟悉:会使用shell的基础命令.能够编译简单的C程序.它不是关于Linux或其编程环境的,而是关于Linux系统编程的基础. 1.4.1 文件和文件系统文件是Linux系统中最基础最重要的抽象.Li