任何人都可以告诉我为什么从管道读取时出现无限循环?我不明白我做错了什么。 message
是我在主顶部定义的名称。 MESSAGE是我的结构名称。它甚至不打印出测试值。从管道读取时无限循环
if(manager_pid == 0)
{
printf("Hello? \n");
if(close(pipe1[READING]) != 0)
{
printf("Error in closing pipe1 \n");
}
if(close(pipe2[READING]) != 0)
{
printf("Error in closing pipe2 \n");
}
if(close(pipe3[WRITING]) != 0)
{
printf("Error in closing pipe \n");
}
}
i = 0;
printf("work please \n");
//test_value = read(pipe3[READING], &boo, sizeof(echo));
//printf("test_value is %d \n", test_value);
while(i < 10)
{
printf("In while \n");
//printf("Hello?? \n");
//test_value = read(pipe3[READING], &boo, sizeof(echo));
//printf("test_value is %d \n", test_value);
//printf("Entering infinite loop \n");
//printf("i is %d \n", i);
//nbytes = read(pipe3[0], array, 45);
//printf("nbytes is %d \n", nbytes);
//log_dat_fp = fopen(argv[2], "a");
if(read(pipe3[READING], &message, sizeof(struct MESSAGE)) != -1)
{
printf("Entering if \n");
log_dat_fp = fopen(argv[2], "a");
printf("First if \n");
time(¤t_time);
//if(message.owner == 1 && (message.instruction == 'r' || message.instruction == 'R'))
if(message.instruction == 'r' || message.instruction == 'R')
{
if(message.owner == 1)
{
printf("message.owner == 1 with r or R \n");
fprintf(log_dat_fp, "Store Manager at time: %s received message %d %d %c %s", strtok(ctime(¤t_time), "\n"),
message.owner, getpid(), message.instruction, message.id);
pclose(log_dat_fp);
}
else if(message.owner == 2)
{
printf("message.owner == 2 with r or R \n");
fprintf(log_dat_fp, "Store Manager at time: %s received message %d %d %c %s", strtok(ctime(¤t_time), "\n"),
message.owner, getpid(), message.instruction, message.id);
pclose(log_dat_fp);
}
else
{
printf("You have junk \n");
}
}
else if(message.instruction == 'u' || message.instruction == 'U')
{
if(message.owner == 1)
{
printf("message.owner == 1 with u or U \n");
fprintf(log_dat_fp, "Store Manager at time: %s received message %d %d %c %s %d", strtok(ctime(¤t_time), "\n"),
message.owner, getpid(), message.instruction, message.id, message.value);
pclose(log_dat_fp);
}
else if(message.owner == 2)
{
printf("message.owner == 2 with u or U \n");
fprintf(log_dat_fp, "Store Manager at time: %s received message %d %d %c %s %d", strtok(ctime(¤t_time), "\n"),
message.owner, getpid(), message.instruction, message.id, message.value);
pclose(log_dat_fp);
}
else
{
printf("You have junk \n");
}
}
else
{
printf("manager can't read from pipe\n");
exit(1);
} // read no good
if(message.instruction == 'r' || message.instruction == 'R')
{
if(message.owner == 1)
{
for(i = 0; i < 200; i++)
{
if(strcmp(storage, table[i].id) == 0)
{
match_flag = 1;
value = table[i].value;
}
}
if(match_flag == 1)
{
message.value = value;
message.owner = 0;
if(write(pipe1[WRITING], &message, sizeof(struct MESSAGE)) == sizeof(struct MESSAGE))
{
log_dat_fp = fopen(argv[2], "a");
time(¤t_time);
fprintf(log_dat_fp, "Store Manager at time: %s sent message: %c %d %s %d\n", strtok(ctime(¤t_time), "\n"),
message.instruction, message.owner, message.id, message.value);
fclose(log_dat_fp);
}
else
{
printf("error returning message to process 1");
exit(1);
}
}
else
message.owner = 1;
if(write(pipe1[WRITING], &message, sizeof(struct MESSAGE)) == sizeof(struct MESSAGE))
{
log_dat_fp = fopen(argv[2], "a");
time(¤t_time);
fprintf(log_dat_fp, "Store Manager at time: %s sent message: %c %d %s \n", strtok(ctime(¤t_time), "\n"),
message.instruction, message.owner, message.id);
fclose(log_dat_fp);
}
}
else if(message.owner == 2)
{
printf("message.owner == 2 with u or U \n");
fprintf(log_dat_fp, "Store Manager at time: %s received message %d %d %c %s %d", strtok(ctime(¤t_time), "\n"),
message.owner, getpid(), message.instruction, message.id, message.value);
pclose(log_dat_fp);
}
else
{
printf("You have junk \n");
}
}
}
else
{
printf("manager had pipe issues.\n");
exit(1);
}// read no good
i++;
//log_dat_fp = fopen(argv[2], "a");
printf("Each pass \n");
}
谁在写信给管道?是你父母的过程吗? – radar 2014-11-01 01:07:30
您不检查部分读取或EOF。 – o11c 2014-11-01 01:07:58
@RADAR另一个我的进程稍后将写'(pipe3r [写作],&消息,sizeof(结构MESSAGE))'。我试图找出为什么我先有一个无限循环。它看起来并不像是阅读。我的printf被完全忽略,所以我认为我对这个'printf(“test_value是%d \ n”,test_value);'有问题。 – cokedude 2014-11-01 01:16:51