2012-09-10 46 views
0

我使用「信號」功能有一些其他麻煩。我有5個子進程和它的父親。信號錯誤:「無效使用void表達式」

一次只能運行一個進程,並且該進程應該有一些延遲(從1到10秒)變爲另一個偶然進程。對於這些更改,它必須使用SIGUSER1信號。這是我的代碼,我有錯誤:

struct compartido{ 
    int pid1, pid2, pid3, pid4, pid5; 
    int propietario;  
    int contador;    
    int pidpadre;    
}; 

    struct compartido* var; 

void manejador(int prop, int actual){ 
    if(signal(SIGUSR1,SIG_IGN)==SIG_ERR){ 
     perror("Error en el Signal.\n"); 
     exit(2); 
    } 
    printf("Proceso %d al mando en el manejador.\n",prop); 

    kill(prop,SIGCONT); 
    if(actual==getpid()) kill(actual,SIGSTOP); 

    sleep(rand() % 11 + 1); 
} 

int main(int argc, char *argv[]) { 

    key_t llave1,llavesem; 
    int idmem,idsem;  


    idmem=shmget(llave1,sizeof(struct compartido),IPC_CREAT|0600); 
    if (idmem==-1) { 
     perror ("shmget"); 
     return 1; 
    } 
    var=(struct compartido*) shmat(idmem,0,0); 
    var->pidpadre=getpid(); 

    var->propietario=var->pid1; 
    /*Next line gives the error*/ 
    if(var->pid1==getpid()) signal(SIGUSR1,manejador(var->propietario, getpid())); 

    /*Doing more things inside...*/ 

    /*Next line gives the error*/ 
    signal(SIGUSR1,manejador(var->propietario, getpid())); 
} 

據我所知,「manejador」可以具有一個int值 無效manejador(int類型){printf的 (用來調用的函數」接收到的信號%d \ n「,s); }

但是我需要2個變量,因爲我應該停止當前進程並重新啓動新進程。

我有確切的錯誤說:

error: invalid use of void expression

能否請你幫我?

回答

0
signal(SIGUSR1,manejador(var->propietario, getpid())); 
  • 你需要通過一個功能標識,而不是調用的函數,即只留下manejdor

  • 信號處理程序有您必須遵守非常具體的佈局:信號處理程序必須採取一int參數和返回void

+0

如果我只是把「manejador」我得到這樣的警告:警告:SI的傳遞參數2不兼容的指針類型[缺省情況下啓用]。 /usr/include/signal.h:101:23:note:expected'__sighandler_t'but argument is of type'void(*)(int,int)' – user1660559

相關問題