0

「シグナル」機能を使用する際に、他にも問題があります。私は5つの子プロセスとその父親を持っています。

一度に 1 つのプロセスのみを実行する必要があり、そのプロセスは、ある程度の遅延 (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」という関数は、1 つの int 値で使用できます。 void manejador(int s){ printf("Signal received %d\n",s); }

ただし、現在のプロセスを停止して新しいプロセスを再起動する必要があるため、内部に 2 つの変数が必要です。

私が抱えている正確なエラーは次のとおりです。

エラー: void 式の使用が無効です

手伝ってくれませんか?

4

1 に答える 1

0
signal(SIGUSR1,manejador(var->propietario, getpid()));
  • 関数を呼び出す代わりに、関数識別子を渡す必要があります。manejdor

  • シグナル ハンドラーには、尊重しなければならない非常に特殊なレイアウトがあります。シグナル ハンドラーは、1 つのintパラメーターを取り、返す必要があります。void

于 2012-09-10T16:23:23.110 に答える