向父母发送信号不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了向父母发送信号不起作用相关的知识,希望对你有一定的参考价值。

我试图制作一个“揭示”MD5加密的程序。为此,我使用了fork()。Parent从文件中读取并将readed一词发送给处理MD5的子进程并进行比较。

问题是我想通过管道将比较发送回父亲,我试图用signal()来做,但它不起作用。

你能给我一些帮助吗?我的“垃圾”代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include<sys/types.h>
#include <openssl/md5.h>
#include <unistd.h>
#include<sys/time.h>
#include"semaforo.h"
#include<sys/wait.h>
#include<signal.h>
#define LONG_MAX_LINEA  100
#define NOM_ARCHIVO  "commonPass.txt"

int boca2[2];
int flag=0;
void senal(int signumber){
    flag=1;
    printf("PAR");
    return;
}




int main()
{
    int boca1[2];
    int pid;
    char linea[LONG_MAX_LINEA];
    char aux;
    struct timeval t1;
    struct timeval t2;
    gettimeofday(&t1, 0);
    int cont=0;
    FILE* entrada;
    int tamLinea;
    int tamSalida;
    const unsigned char* prueba;
    int i;
    int andando=1;
    unsigned char result[MD5_DIGEST_LENGTH];
    int nacimiento;
    sem_bin semaforo(true);
    int x;
    char salida[2];
        const unsigned char md50[MD5_DIGEST_LENGTH] = {0xbe, 0x48, 0x44, 0x81, 0x0c, 0xf8, 0xf6, 0x4c, 0x82, 0x0d, 0x71, 0x88, 0x37, 0xc5, 0xf5, 0x3b};
        const unsigned char md51[MD5_DIGEST_LENGTH] = {0xb3, 0x40, 0x35, 0xd5, 0x66, 0x44, 0xdb, 0x4a, 0xb8, 0x4f, 0x12, 0x93, 0x63, 0x5f, 0x36, 0x64};
        const unsigned char md52[MD5_DIGEST_LENGTH] = {0xf0, 0x4b, 0x5c, 0xaf, 0x6e, 0x61, 0xd9, 0x4c, 0x97, 0x0f, 0x39, 0x2b, 0x13, 0x66, 0x11, 0x18};
        const unsigned char md53[MD5_DIGEST_LENGTH] = {0x27, 0x4f, 0x26, 0x46, 0xa2, 0x69, 0xf5, 0x74, 0x12, 0xd5, 0xfc, 0xd3, 0xbf, 0x9d, 0xfd, 0x0c};
        const unsigned char md54[MD5_DIGEST_LENGTH] = {0x08, 0x70, 0x28, 0x07, 0xb4, 0xd2, 0xf6, 0x2b, 0x65, 0xbb, 0x74, 0x4d, 0x63, 0x16, 0xd1, 0x41};
        const unsigned char md55[MD5_DIGEST_LENGTH] = {0xb8, 0x8f, 0x6a, 0x0f, 0x48, 0xcd, 0x38, 0x30, 0x85, 0x5f, 0x0a, 0xca, 0x82, 0x97, 0xa4, 0x25};




    if(pipe(boca1)== -1 || pipe(boca2)==-1){
        perror("tuberia");
        exit(-1);
    }

    entrada = fopen(NOM_ARCHIVO, "r");

    if (entrada == NULL){
        perror(NOM_ARCHIVO);
        return EXIT_FAILURE;
    }
    if(!semaforo.creado()){
            perror("No se crea el semaforo");
            return EXIT_FAILURE;
    }


    for(nacimiento=0; nacimiento<1; nacimiento++){
    pid=fork();
        if(pid==0){

            break;
        }
    }

    switch(pid){

        case -1: perror("fork");
            exit (-1);
        case 0: 


        while(1){

            semaforo.wait();
            read(boca1[0],&tamLinea, sizeof(int));
            read(boca1[0],linea, tamLinea);
            semaforo.signal();

            linea[tamLinea-1]=0;
            tamLinea-=2;

            if(strcmp(linea, "exitprimo")==0)
                exit(0);


            prueba= reinterpret_cast<const unsigned char *>(linea);

            MD5(prueba, tamLinea, result);    
            cont++;    




            if(!memcmp(result,md50,MD5_DIGEST_LENGTH) || !memcmp(result,md51,MD5_DIGEST_LENGTH)
            || !memcmp(result,md52,MD5_DIGEST_LENGTH) || !memcmp(result,md53,MD5_DIGEST_LENGTH)
            || !memcmp(result,md54,MD5_DIGEST_LENGTH) || !memcmp(result,md55,MD5_DIGEST_LENGTH)){
                signal(SIGUSR1,senal);
                sleep(1);

             }


        }






        default: 
        while(1){

            fgets(linea, LONG_MAX_LINEA, entrada);

            if(feof(entrada)){
            for(x=0; x<1; x++){            
            write(boca1[1],"exitprimo",9);
            }
            gettimeofday(&t2, NULL);

    printf("eso es todo el archivo

");

    printf("Tiempo trancurrido: %f seg.

", (double)(t2.tv_usec-t1.tv_usec)/1000000 +
                        (double)(t2.tv_sec - t1.tv_sec));
            exit(0);
            }
            tamLinea=strlen(linea)+1;
            write(boca1[1],&tamLinea, sizeof(int));
            write(boca1[1], linea, tamLinea);



        }


    }







}
答案

tou没有向USR1注册一个信号处理程序,因此没有理由将该函数称为void senal(int signumber)

你可以查看我的帖子,它可能会有所帮助... https://omerdagan.000webhostapp.com/linux_signal.html希望可能有所帮助...这也是非常好的文档处理在线

注意:我没有看过你的其余逻辑

以上是关于向父母发送信号不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从父母向孩子发送信号,反之亦然

从 C++ (Qt5) 向 QML 项目发送信号

向 FCM 服务器发送推送通知不起作用

Linux信号:孩子没有收到

从 UICollectionView 向 detailview 发送信息不起作用?

当孩子必须更新父母的状态时,this.setState 不起作用