C - 信号误差:"invalid use of void expression"



我在使用"signal"函数时遇到了一些其他问题。我有5个孩子的过程和它的父亲。

一次只应运行一个进程,并且该进程应更改为另一个具有一定延迟的可选进程(从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 s){printf("接收到的信号%d\n",s);}

但我需要两个变量,因为我应该停止当前的过程,重新启动新的过程。

我的确切错误是:

错误:无效使用void表达式

你能帮帮我吗?

signal(SIGUSR1,manejador(var->propietario, getpid()));
  • 您需要传递函数标识符,而不是调用函数,即只需留在manejdor

  • 信号处理程序有非常具体的布局,您必须遵守:信号处理程序必须接受一个int参数并返回void

最新更新