2

以下程序不产生输出。它进入 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 信号是什么意思?

4

3 回答 3

11

信号在SIGXCPU超过其消耗的处理器时间限制 ( ) 后每秒发送到一个进程RLIMIT_CPU,或者,对于实时进程,它在不休眠的情况下运行的限制。这里的问题在于您的递归z函数不会停止并一次又一次地调用自身(并导致堆栈溢出)。修复其停止条件。

信号手册页:

Signal | Default Action | Description
-------+----------------+-------------------------
SIGXCPU| A              | CPU time limit exceeded.

默认操作如下:

A - 进程异常终止。此外,可能会发生实现定义的异常终止操作,例如创建核心文件。

于 2013-03-29T04:51:43.863 回答
4

它可能会消耗比 ideone 允许的更多 CPU 时间和/或相关资源,因此您的程序不会使站点过载。

检查您的递归和终止条件。

于 2013-03-29T04:46:51.790 回答
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 秒。

希望你能理解。

于 2019-10-08T09:59:03.107 回答