Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 信号错误:";“无效表达式”的无效使用;_C_Signals_Multiprocess - Fatal编程技术网

C 信号错误:";“无效表达式”的无效使用;

C 信号错误:";“无效表达式”的无效使用;,c,signals,multiprocess,C,Signals,Multiprocess,我在使用“信号”功能时遇到了一些其他问题。我有5个孩子和它的父亲 一次只能运行一个进程,并且该进程应该以一定的延迟(从1秒到10秒)更改为另一个进程。对于这些更改,必须使用SIGUSER1信号。这是我的代码和错误: struct compartido{ int pid1, pid2, pid3, pid4, pid5; int propietario; int contador; int pidpadre; };

我在使用“信号”功能时遇到了一些其他问题。我有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值一起使用 void manejador(int s){ printf(“接收到的信号%d\n”,s); }

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

我所犯的确切错误是:

错误:无效使用void表达式

你能帮帮我吗

  • 您需要传递函数标识符,而不是调用函数,即只需留在
    manejdor

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

如果我刚刚输入“manejador”,我会收到以下警告:警告:传递不兼容指针类型的信号参数2[默认情况下已启用]/usr/include/signal.h:101:23:注意:应为“\uu signandler\u t”,但参数的类型为“void(*)(int,int)”
signal(SIGUSR1,manejador(var->propietario, getpid()));