以下程序未生成输出。它进入for循环并获取一个值(通过scanf
)但在此之后代码块停止执行。 Ideone(在线编译器和调试工具)表示生成了SIGXCPU信号。
#include <stdio.h>
#include <stdlib.h>
long fact(int);
int z(int);
int main()
{
int i, n;
scanf("%d",&n);
int a[10];long b[10];
int c[10];
for(i=0;i<n;i++)
{
scanf("%d", &a[i]);
b[i]=fact(a[i]);
c[i]=z(b[i]);
}
printf("\n");
for(i=0; i<n; i++)
{
printf("%d", c[i]);
}
return 0;
}
long fact(int m)
{
if (m==1) return 1;
else return (m*fact(m-1));
}
int z (int s)
{
int c=0, temp;
temp=s%10;
if(temp!=0) return c;
else
{
c++; z(temp);
}
}
SIGXCPU信号是什么意思?
答案 0 :(得分:7)
SIGXCPU
信号在超过其消耗的处理器时间限制(RLIMIT_CPU
)后每秒发送一个进程,或者,对于实时进程,它在没有休眠的情况下运行的限制。
这里的问题是您的递归z
函数不会停止并一次又一次地调用自身(并导致堆栈溢出)。修复其停止状态。
从signal手册页:
Signal | Default Action | Description -------+----------------+------------------------- SIGXCPU| A | CPU time limit exceeded.
默认操作如下:
A - 流程异常终止。 此外,实现定义的异常终止操作, 例如创建核心文件,可能会发生。
答案 1 :(得分:4)
它可能消耗更多的CPU时间和/或相关资源,而不是ideone允许,因此您的程序不会使站点过载。
检查您的递归和终止条件。
答案 2 :(得分:0)
如果发现递归没有问题,则可以使用以下方法更改CPU时间限制(RLIMIT_CPU):
setrlimit(); (set time slice for cpu)
在此程序中,我们将CPU时间设置为等于15秒。您可以根据需求进行设置,但是请确保它设置为较低,因为您的cpu忙于长时间执行该过程,并且我们失去了cpu的多任务处理和一致性。
struct rlimit v;
v.rlim_cur=15; //set the soft limit to 15 sec
setrlimit(RLIMIT_CPU,&v);
在将时间片设置为cpu 15秒之后,所有操作都完成了。
希望您能理解