C 向父节点发送信号´;行不通
我正在尝试制作一个“揭示”MD5加密的程序。为此,我使用了fork()。父对象从文件中读取单词readed并将其发送给处理MD5并进行比较的子对象 问题是,我想通过一根管子把比较结果发回给父亲,我试图用signal()来做,但它不起作用 你能给我一些帮助吗? 我的“垃圾”代码:C 向父节点发送信号´;行不通,c,pipe,signals,fork,md5,C,Pipe,Signals,Fork,Md5,我正在尝试制作一个“揭示”MD5加密的程序。为此,我使用了fork()。父对象从文件中读取单词readed并将其发送给处理MD5并进行比较的子对象 问题是,我想通过一根管子把比较结果发回给父亲,我试图用signal()来做,但它不起作用 你能给我一些帮助吗? 我的“垃圾”代码: #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括“semaforo.h” #包括 #包括 #定义长\u最大\u直线A 100 #定义NOM_ARCHIVO“commonPass.txt” int-b
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“semaforo.h”
#包括
#包括
#定义长\u最大\u直线A 100
#定义NOM_ARCHIVO“commonPass.txt”
int-boca2[2];
int标志=0;
void senal(int signumber){
flag=1;
printf(“PAR”);
返回;
}
int main()
{
int boca1[2];
int-pid;
字符线[LONG_MAX_linea];
char aux;
结构时间值t1;
结构时间值t2;
gettimeofday(&t1,0);
int cont=0;
文件*entrada;
塔姆利纳国际酒店;
塔姆萨利达国际酒店;
常量无符号字符*prueba;
int i;
int andando=1;
无符号字符结果[MD5_摘要_长度];
国际纳西门托;
sem_bin semaforo(真);
int x;
char-salida[2];
常量无符号字符md50[MD5_DIGEST_LENGTH]={0xbe、0x48、0x44、0x81、0x0c、0xf8、0xf6、0x4c、0x82、0x0d、0x71、0x88、0x37、0xc5、0xf5、0x3b};
常量无符号字符md51[MD5_DIGEST_LENGTH]={0xb3、0x40、0x35、0xd5、0x66、0x44、0xdb、0x4a、0xb8、0x4f、0x12、0x93、0x63、0x5f、0x36、0x64};
常量无符号字符md52[MD5_DIGEST_LENGTH]={0xf0、0x4b、0x5c、0xaf、0x6e、0x61、0xd9、0x4c、0x97、0x0f、0x39、0x2b、0x13、0x66、0x11、0x18};
常量无符号字符md53[MD5_DIGEST_LENGTH]={0x27、0x4f、0x26、0x46、0xa2、0x69、0xf5、0x74、0x12、0xd5、0xfc、0xd3、0xbf、0x9d、0xfd、0x0c};
常量无符号字符md54[MD5_DIGEST_LENGTH]={0x08、0x70、0x28、0x07、0xb4、0xd2、0xf6、0x2b、0x65、0xbb、0x74、0x4d、0x63、0x16、0xd1、0x41};
常量无符号字符md55[MD5_DIGEST_LENGTH]={0xb8、0x8f、0x6a、0x0f、0x48、0xcd、0x38、0x30、0x85、0x5f、0x0a、0xca、0x82、0x97、0xa4、0x25};
如果(管道(boca1)=-1 | |管道(boca2)=-1){
佩罗(“结节”);
出口(-1);
}
entrada=fopen(名称为“r”);
如果(entrada==NULL){
佩罗尔(姓名);
返回退出失败;
}
如果(!semaforo.creado()){
perror(“无需任何理由”);
返回退出失败;
}
对于(nacimiento=0;nacimientotou,不要将信号处理程序注册到USR1
,因此没有理由调用函数void senal(int signumber)
你可以查看我的帖子,这可能会有帮助。。。
希望这可能会有所帮助…这也是一个很好的在线记录过程
注意:我没有看你的逻辑的其余部分
#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\n\n");
printf("Tiempo trancurrido: %f seg.\n\n", (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);
}
}
}