Дочерний процесс зависает при использовании общей памяти?

Я испытываю довольно странный вывод из некоторого кода c. Конечно, я новичок в разработке на C и Linux, так как мой опыт сосредоточен на .NET и C#.

В любом случае я должен был написать реализацию FAT12 и командную оболочку на c. Моя оболочка зависает всякий раз, когда дочерний процесс пытается получить доступ к общей памяти. На самом деле вообще ничего не происходит, что очень странно. Может ли кто-нибудь помочь мне отладить код?

Спасибо,

Это основной цикл, который запускает оболочку:

while(strcmp(input, "EXIT") != 0 )
    {
        scanf("%s", input);
        input = String_ToFixedArray(input);

        array = StringArray_Create(input, " "); //split the input string into array.

        if( array->Items == NULL || array->Size == 0 )
        {
            input = "CONTINUE";
            continue;
        }

        if( strcmp(String_ToUpper(array->Items[0]), "PBS") == 0)
        {
            pid_t processId;

            if((processId = fork()) < 0 )
            {
                printf("%s", "Error executing command.");
            }

            //child process. Nothing happens???????
            if( processId == 0 )
            {
                ExecutePBS();
            }
        }
        else if( strcmp(String_ToUpper(array->Items[0]), "PFE") == 0 )
        {
            printf("Execute Print Fat Entries (PFE) Command\n");
        }
        else if( strcmp(String_ToUpper(array->Items[0]), "EXIT") == 0 )
        {
            printf("Exiting..");
            break;
        }
        else
        {
            input = "CONTINUE";
        }

    }

Это «драйверная» функция, которая будет печатать содержимое загрузочного сектора (PBS). Проблема в том, что всякий раз, когда эта функция выполняется, ничего не происходит!

void ExecutePBS(void)
{
    int shm_file_id;
    char* shm_file;
    char* shm_file_ptr;
    struct shmid_ds shm_file_buffer;

    if( (shm_file_id = shmget(SHM_FILE_NAME_KEY,SHM_FILE_NAME_SIZE, 0666)) < 0)
    {
        perror("Error locating shared memory segment.");
        exit(1);
    }

    if((shm_file = shmat(shm_file_id, NULL, 0)) == (char *) -1)
    {
        perror("Error attaching shared memory segment to process' scope.");
        exit(1);
    }

    if(shmctl(shm_file_id, IPC_STAT, &shm_file_buffer) == -1 )
    {
        perror("Error while attempting to control the shared memory segment used to store the floppy file name for IPC.");
        exit(1);
    }

    sprintf(shm_file_ptr, "%s", shm_file);

    if( shmdt(shm_file) == -1)
    {
        perror("Error releasing shared memory.");
        exit(1);
    }

    FILE* floppyImage = fopen(shm_file_ptr, "r+");

    if (floppyImage == NULL)
    {
        printf("Could not open the floppy drive or image.\n");
        exit(1);
    }

    BootSector* bootSector = BootSector_ReadBootSector(floppyImage);
    BootSector_ToString(bootSector);

    return;
}

person bleepzter    schedule 14.04.2011    source источник
comment
на самом деле не большой форкер... но я так понимаю, что он вернул = 0 для дочернего процесса! = 0 для родительского... так что у вас должно быть два набора логики, по одному для каждого случая... в его нынешнем виде, после того, как клиент вызвал метод, он также начнет обход цикла while, это правильно? также ... что вы подразумеваете под «ничего» не происходит ... вы пытались поставить printfs для повышения видимости?   -  person forsvarir    schedule 15.04.2011
comment
@forsvarir Пожалуйста, напишите это как ответ. Ты прав. Изменение этого на != 0 было ответом ... Как глупо с моей стороны копировать из Интернета ... Я бы никогда не поймал эту ошибку.   -  person bleepzter    schedule 15.04.2011
comment
хммм... Я бы подумал, что это может быть что-то большее... но я не использовал общую память в Unix со времен университета...   -  person forsvarir    schedule 15.04.2011


Ответы (1)


на самом деле не большой форкер... но я так понимаю, что он вернул = 0 для дочернего процесса! = 0 для родительского... так что у вас должно быть два набора логики, по одному для каждого случая... в его нынешнем виде, после того, как клиент вызвал метод, он также начнет обход цикла while, это правильно? также ... что вы подразумеваете под «ничего» не происходит ... вы пытались поставить printfs для повышения видимости?

person forsvarir    schedule 14.04.2011