【问题标题】:signal error: "invalid use of void expression"信号错误:“无效表达式的使用”
【发布时间】:2012-09-03 13:18:50
【问题描述】:

我在使用“信号”功能时遇到了一些其他问题。我有 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); }

但我需要 2 个变量,因为我应该停止当前进程并重新启动新进程。

我遇到的确切错误是:

错误:无效表达式的使用无效

你能帮帮我吗?

【问题讨论】:

    标签: c signals multiprocess


    【解决方案1】:
    signal(SIGUSR1,manejador(var->propietario, getpid()));
    
    • 你需要传递一个函数标识符而不是调用一个函数,即直接留在manejdor

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

    【讨论】:

    • 如果我只输入“manejador”,我会收到此警报:警告:从不兼容的指针类型传递信号的参数 2 [默认启用]。 /usr/include/signal.h:101:23:注意:预期为“__sighandler_t”,但参数的类型为“void (*)(int, int)”
    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多