#c #linux #fork #shared-memory
#c #linux #форк #разделяемая память
Вопрос:
Я испытываю довольно странный вывод из некоторого 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) Commandn");
}
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, amp;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. на самом деле это не большая проблема… но, насколько я понимаю, он вернул = 0 для дочернего процесса!= 0 для родительского… итак, у вас должно быть два набора логики, по одной для каждого случая … в нынешнем виде, после того, как клиент вызвал метод, он также начнет выполнять цикл while, это правильно? также.. что вы подразумеваете под «ничего» не происходит… вы пробовали использовать printfs для повышения видимости?
2. @forsvarir Пожалуйста, напишите это в качестве ответа. Вы правы. Ответом было изменение этого значения на != 0… Как глупо с моей стороны копировать из Интернета… Я бы никогда не обнаружил эту ошибку.
3. хммм… Я бы подумал, что здесь могло быть что-то большее, чем это … но я не использовал общую память в unix со времен университета…
Ответ №1:
на самом деле это не большая проблема… но, насколько я понимаю, он вернул = 0 для дочернего процесса!= 0 для родительского… итак, у вас должно быть два набора логики, по одной для каждого случая … в нынешнем виде, после того, как клиент вызвал метод, он также начнет выполнять цикл while, это правильно? также.. что вы подразумеваете под «ничего» не происходит… вы пробовали использовать printfs для повышения видимости?