2012-05-01 3 views
2

У меня есть этот кодC++ ограничения дочернего процесса игнорировать SIGXCPU

static void sigXCPU(int pTmp){ 
    cout<<" .... "; 
} 

..... 
pid_t vPid=fork(); 
    int vStat; 

    switch(vPid){ 
    case -1: perror("fork"); 
    exit(1); 
    case 0: 
    //limit on data 
    struct rlimit vLimD; 
    vLimD.rlim_cur = 100000; 
    vLimD.rlim_max = 1000000; 
    setrlimit(RLIMIT_DATA, &vLimD); 
    //limit on cpu time 
    struct rlimit vLimCPU; 
    vLimCPU.rlim_cur = 1; 
    vLimCPU.rlim_max = 1; 

    execl("./p1","",NULL);  
    if(signal(SIGXCPU,sigXCPU)==SIG_ERR); 
    break; 
    default: 
    while(wait(&vStat)!=vPid); 
    break;} 

и код для p1 является

int main(){ 
    sleep(10); 
return 0;} 

Почему ребенок игнорирует SIGXCPU? Код скомпилирован с GCC под FreeBSD 8.0 amd64 ,

ответ

3

Код у ребенка после execl никогда не выполняется, поскольку текущее изображение процесса заменяется приложением в p1.

Даже если вы должны были поставить обработчик сигнала перед execl, это было бы чрезмерно усложнено, потому что расположение сигналов сброшено до значений по умолчанию после exec. В конце концов, ваша функция обработчика больше не будет присутствовать в новом образе процесса.

Наконец, чтобы настроить обработчик сигнала, не используйте signal и используйте вместо него sigaction.

+1

+1. В частности, для редактирования, где вы добавили обсуждение «исправления» (в кавычках) кода, чтобы вызов «signal» был сделан до вызова 'execl'. –

+0

@David, я также рекомендовал использовать 'sigaction' вместо' signal' для добавления обработчика в духе дальнейшего образования. –

+0

Пила это. Не то, чтобы это помогло с этой проблемой. К xnl96: всего лишь один код, который должен иметь после вызова 'exec' - это вызов' exit', возможно, с сообщением об ошибке. Возврат из 'exec' происходит только тогда, когда что-то пошло не так с' exec'. –

Смежные вопросы