Команда Chef / knife для обновления клиентов после смены роли

Для назначения класса мы пишем специальный системный вызов, который извлекает определенную информацию о существующем дереве процессов. Системный вызов по большей части работает нормально и получает соответствующую информацию. Однако некоторые обрабатывают его, вылетая с сообщением об ошибке «Невозможно обработать разыменование нулевого указателя ядра по виртуальному адресу [адрес]». Чего я не понимаю, так это того, что я проверяю, является ли указатель 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: базовый {} список collection = new List (); collection.Add (новый A ()); ...

У меня есть коллекция, содержащая два типа объектов 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 не может этого сделать. Большое спасибо.

41
задан jaks 1 October 2010 в 20:40
поделиться