Дочерний процесс зависает при использовании разделяемой памяти? - PullRequest
3 голосов
/ 15 апреля 2011

Я получаю довольно странный вывод из некоторого 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;
}

1 Ответ

4 голосов
/ 15 апреля 2011

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

...