C语言中信号问题
#include<stdio.h>#include<signal.h>#include<unistd.h>#include<sys/times.h>#include<st...
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/times.h>
#include <stdlib.h>
#define err_sys( str ) printf("error:%s\n" , str )
#define MAXLINES 1000
char *lineptr[MAXLINES];
#define BUFFERSIZE 1000
static void sig_int(int signo)
{
struct tms timebuf;
int wallclock=times(&timebuf);
fprintf(stderr,"clock ticks since system startup are %d,\n",wallclock);
}
static void sig_term(int signo)
{
struct tms timebuf;
int wallclock=times(&timebuf);
fprintf(stderr,"clock ticks since system start are %d,\n",wallclock);
exit(0); //exit
}
static void sig_tstp(int signo)
{
int nlines, i, offset;
char buffer[BUFFERSIZE];
nlines = readlines(lineptr, buffer, MAXLINES);
if (nlines < 10) {
printf("error: only can print the last %d lines.\n", nlines);
offset = 0;
}
else {
offset = nlines - 10;
}
for (i = 0; i < nlines && i < 10; i++)
printf("%s\n", lineptr[offset + i]);
}
int readlines(char *lineptr[], char *buffer, int maxlines)
{
int c, nlines;
char *p;
/* The input lines are stored end-to-end in the buffer, with
newlines converted to null bytes. */
p = buffer;
while ((c = getchar()) != EOF) {
if (c == '\n')
*p = '\0';
else
*p = c;
p++;
if (p >= buffer + BUFFERSIZE) {
p = buffer;
}
}
return nlines;
}
static void sig_alrm(int signo)
{
static int times=1;
alarm(0);//don't tick when output
printf("tick:%d\n" , times*10 );
times++ ;
alarm(10); //restart
}
int main()
{
if (signal(SIGINT,sig_int)==SIG_ERR)
err_sys("can't catch SIGINT");
if (signal(SIGTERM,sig_term)==SIG_ERR)
err_sys("can't catch SIGTERM");
if (signal(SIGTSTP,sig_term)==SIG_ERR)
err_sys("can't catch SIGTSTP");
printf("tick:%d\n",0);
alarm(10); //start
if (signal(SIGALRM,sig_alrm)==SIG_ERR)
err_sys("can't catch SIGALRM");
while(1) ; //wait here
return(0);
}
我想在接收sigterm时有我程序中的输出,但是现在没有;Kill -15 却有输出,但是我不想它有输出,求大神改改程序,谢谢啦
程序需要在接收到sigterm后输出程序时间并退出程序,我这个好像没有输出吧?求各位大神再看看 展开
#include <signal.h>
#include <unistd.h>
#include <sys/times.h>
#include <stdlib.h>
#define err_sys( str ) printf("error:%s\n" , str )
#define MAXLINES 1000
char *lineptr[MAXLINES];
#define BUFFERSIZE 1000
static void sig_int(int signo)
{
struct tms timebuf;
int wallclock=times(&timebuf);
fprintf(stderr,"clock ticks since system startup are %d,\n",wallclock);
}
static void sig_term(int signo)
{
struct tms timebuf;
int wallclock=times(&timebuf);
fprintf(stderr,"clock ticks since system start are %d,\n",wallclock);
exit(0); //exit
}
static void sig_tstp(int signo)
{
int nlines, i, offset;
char buffer[BUFFERSIZE];
nlines = readlines(lineptr, buffer, MAXLINES);
if (nlines < 10) {
printf("error: only can print the last %d lines.\n", nlines);
offset = 0;
}
else {
offset = nlines - 10;
}
for (i = 0; i < nlines && i < 10; i++)
printf("%s\n", lineptr[offset + i]);
}
int readlines(char *lineptr[], char *buffer, int maxlines)
{
int c, nlines;
char *p;
/* The input lines are stored end-to-end in the buffer, with
newlines converted to null bytes. */
p = buffer;
while ((c = getchar()) != EOF) {
if (c == '\n')
*p = '\0';
else
*p = c;
p++;
if (p >= buffer + BUFFERSIZE) {
p = buffer;
}
}
return nlines;
}
static void sig_alrm(int signo)
{
static int times=1;
alarm(0);//don't tick when output
printf("tick:%d\n" , times*10 );
times++ ;
alarm(10); //restart
}
int main()
{
if (signal(SIGINT,sig_int)==SIG_ERR)
err_sys("can't catch SIGINT");
if (signal(SIGTERM,sig_term)==SIG_ERR)
err_sys("can't catch SIGTERM");
if (signal(SIGTSTP,sig_term)==SIG_ERR)
err_sys("can't catch SIGTSTP");
printf("tick:%d\n",0);
alarm(10); //start
if (signal(SIGALRM,sig_alrm)==SIG_ERR)
err_sys("can't catch SIGALRM");
while(1) ; //wait here
return(0);
}
我想在接收sigterm时有我程序中的输出,但是现在没有;Kill -15 却有输出,但是我不想它有输出,求大神改改程序,谢谢啦
程序需要在接收到sigterm后输出程序时间并退出程序,我这个好像没有输出吧?求各位大神再看看 展开
3个回答
展开全部
信号是程序执行过程中出现的异常情况。它可能是由程序中的错误造成的,例如引用内存中的一个非法地址;或者是由程序数据中的错误造成的,例如浮点数被0除;或者是由外部事件引发的,例如用户按了Ctrl+Break键。
你可以利用标准库函数signal()指定要对这些异常情况采取的处理措施(实施处理措施的函数被称为“信号处理函数”)。signal()的原型为:
#include <signal.h>
void(*signal(int hum,void(*func)(int)))(int);
如果定义一个typedef,理解起来就容易一些了。下面给出的sigHandler_t类型是指向一个程序的指针,该函数有一个int类型的参数,并且返回一个void类型:
typedef void(*sigHandler_t)(int);
sigHandler_t signal(int num , sigHandler_t func);
signal()有两个参数,分别为int类型和sigHandler_t类型,其返回值为sigHandler_t类型。以func参数形式传递给signal()的那个函数将成为第num号异常情况的新的信号处理函数。signal()的返回值是信号hum原来的信号处理函数。在设置了一个暂时的信号处理函数之后,你可以利用该值恢复程序先前的行为。num的可能值依赖于系统,并且在signal.h中列出。func的可能值可以是你的程序中的任意函数,或者是SIG_DFL和SLG_IGN这两个特别定义的值之一。SIG_DFL是指系统的缺省处理措施,通常是暂停执行程序;SIG_IGN表示信号将被忽略。
你可以利用标准库函数signal()指定要对这些异常情况采取的处理措施(实施处理措施的函数被称为“信号处理函数”)。signal()的原型为:
#include <signal.h>
void(*signal(int hum,void(*func)(int)))(int);
如果定义一个typedef,理解起来就容易一些了。下面给出的sigHandler_t类型是指向一个程序的指针,该函数有一个int类型的参数,并且返回一个void类型:
typedef void(*sigHandler_t)(int);
sigHandler_t signal(int num , sigHandler_t func);
signal()有两个参数,分别为int类型和sigHandler_t类型,其返回值为sigHandler_t类型。以func参数形式传递给signal()的那个函数将成为第num号异常情况的新的信号处理函数。signal()的返回值是信号hum原来的信号处理函数。在设置了一个暂时的信号处理函数之后,你可以利用该值恢复程序先前的行为。num的可能值依赖于系统,并且在signal.h中列出。func的可能值可以是你的程序中的任意函数,或者是SIG_DFL和SLG_IGN这两个特别定义的值之一。SIG_DFL是指系统的缺省处理措施,通常是暂停执行程序;SIG_IGN表示信号将被忽略。
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
单片机,即单片微控制器,也称为单片微型计算机,是将中央处理器(CPU)、存储器(ROM,RAM)、输入/输出接口和其他功能部件集成在一块 在一个小块的集成电路上,从而实现对整个电路或系统的数字式控制。单片机不是完成某一个逻辑功能的芯片,而是...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
SIGTERM的值就是15
见下表,linux下可查/usr/include/asm/signal.h
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#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
#define SIGSTKFLT 16
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGPROF 27
#define SIGWINCH 28
#define SIGIO 29
#define SIGPOLL SIGIO
见下表,linux下可查/usr/include/asm/signal.h
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#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
#define SIGSTKFLT 16
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGPROF 27
#define SIGWINCH 28
#define SIGIO 29
#define SIGPOLL SIGIO
追问
程序需要在接收到sigterm后输出程序时间并退出程序,我这个好像没有输出吧?
追答
if (signal(SIGTERM,sig_term)==SIG_ERR) //这句是注册sig_term
static void sig_term(int signo) //这是sig_term的定义,其中有输出
{
struct tms timebuf;
int wallclock=times(&timebuf);
fprintf(stderr,"clock ticks since system start are %d,\n",wallclock);
exit(0); //exit
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的信号捕捉程序没问题,但是你没有搞清楚SIGTERM信号的值
追问
那应该是什么啊?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询