Can anyone tell me why I have an infinite loop when reading from a pipe?

i = 0;

while(i < 10)
{
    test_value = read(pipe3[READING], &message, sizeof(struct MESSAGE));
    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("First if  \n");
        time(&current_time);
        if(message.owner == 1 && (message.instruction == 'r' || message.instruction == 'R'))
        {
            printf("First if  \n");
            fprintf(log_dat_fp, "Store Manager at time: %s received message %d %d %c %s", strtok(ctime(&current_time), "\n"), 
            message.owner, child_pid2, message.instruction, message.id);
            pclose(log_dat_fp);
        }
    }
    else
    {
        printf("manager can't read from pipe\n");
        exit(1);
    } // read no good
    i++;
    log_dat_fp = fopen(argv[2], "a");
    printf("Each pass  \n");
}

Recommended Answers

All 2 Replies

If no process is reading from the client_output fifo, then the background pipeline is not starting. Since the process that reads client_output does not start until a line is read from client_output_for_request_forming, your processes are blocked.

Here is more code can anyone spot a problem?

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(&current_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(&current_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(&current_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(&current_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(&current_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(&current_time);
                        fprintf(log_dat_fp, "Store Manager at time: %s sent message: %c %d %s %d\n", strtok(ctime(&current_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(&current_time);
                        fprintf(log_dat_fp, "Store Manager at time: %s sent message: %c %d %s \n", strtok(ctime(&current_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(&current_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");
}
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.