Для назначения класса мы пишем специальный системный вызов, который извлекает определенную информацию о существующем дереве процессов. Системный вызов по большей части работает нормально и получает соответствующую информацию. Однако некоторые обрабатывают его, вылетая с сообщением об ошибке «Невозможно обработать разыменование нулевого указателя ядра по виртуальному адресу [адрес]». Чего я не понимаю, так это того, что я проверяю, является ли указатель NULL перед доступом к нему, и тем не менее, он все равно не работает.
Пример: В приведенном ниже коде current_process - действительный указатель на task_struct, а k_buf действителен
printk("Setting parent process\n");
parent_process = current_process->real_parent;
printk("Parent process set\n");
if (parent_process != NULL) {
printk("Parent process is not null and getting pid\n");
k_buf[i].parent_pid = parent_process->pid;
} else {
k_buf[i].parent_pid = 0;
}
printk("Done with parent process\n");
При запуске программа печатает:
Setting parent process
Parent process set
Parent process is not null and getting pid
Done with parent process
пару раз, а затем
Setting parent process
Parent process set
Parent process is not null and getting pid
перед тем, как выдать ошибку и войти в панику ядра.
Что такое Я делаю не так? Есть какие-нибудь мысли?
РЕДАКТИРОВАТЬ:
На данный момент я закомментировал приведенный выше код, чтобы я мог продолжить работу над остальной частью системного вызова. Когда я пытаюсь получить доступ к pid дочернего процесса (снова после пары успешных попыток), он выдает ошибку «Не удается обработать запрос ядра на подкачку по виртуальному адресу». Насколько я понимаю, у меня есть правильные блокировки для чтения этих данных. Тем не мение,
Класс A: базовый {}
Класс B: базовый {} список
У меня есть коллекция, содержащая два типа объектов A и B.
Class Base{}
Class A : Base {}
Class B : Base {}
List<Base> collection = new List<Base>();
collection.Add(new A());
collection.Add(new B());
collection.Add(new A());
collection.Add(new A());
collection.Add(new B());
Теперь я хочу выбрать объекты из коллекции в зависимости от их типа (A или B, но не обоих).
Как Я могу написать для этого LINQ-запрос? Пожалуйста, помогите мне. В противном случае мне нужно перебрать коллекцию в цикле, чего я не хочу. Спасибо.
Редактировать:
Спасибо всем за вашу помощь. Теперь я могу использовать OfType () из LINQ. Но я думаю, что в моем случае это не сработает. Моя ситуация
Class Container
{
List<Base> bases;
}
List<Container> containers = new List<Container>();
. Теперь я хочу выбрать контейнер из контейнеров, который имеет хотя бы один тип A. Может быть, LINQ не может этого сделать. Большое спасибо.