Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

216
Visualizações
No se puede obtener el pid correcto en WSL2

Estoy aprendiendo programación Linux.
Cuando trato de escribir un módulo simple para obtener la familia de un proceso, encuentro que no puedo obtener el pid actual de un proceso y su proceso principal. ¿Como arreglarlo?
Aquí hay una parte de mi código.

 static pid_t pid = 1; module_param(pid, int, 0644); static int hello_init(void) { struct task_struct *p; struct list_head *pp; struct task_struct *psibling; struct pid *kpid; kpid = find_get_pid(pid); p = pid_task(kpid, PIDTYPE_PID); printk("me: %d %s\n", pid, p->comm); if (p->parent == NULL) { printk("No Parent\n"); } else { printk("Parent: %d %s\n", p->parent->pid, p->parent->comm); } list_for_each(pp, &p->parent->children) { psibling = list_entry(pp, struct task_struct, sibling); printk("sibling %d %s \n", psibling->pid, psibling->comm); } list_for_each(pp, &p->children) { psibling = list_entry(pp, struct task_struct, sibling); printk("children %d %s \n", psibling->pid, psibling->comm); } return 0; }

resultado:

 sudo insmod module.ko pid=1 dmesg [ 6396.170631] me: 237 systemd [ 6396.170633] Parent: 235 unshare [ 6396.170633] sibling 237 systemd [ 6396.170633] children 286 systemd-journal [ 6396.170634] children 306 systemd-udevd [ 6396.170635] children 314 systemd-network [ 6396.170635] children 501 snapfuse [ 6396.170636] children 508 dbus-daemon [ 6396.170636] children 509 NetworkManager [ 6396.170637] children 632 systemd-logind [ 6396.170637] children 639 systemd [ 6396.170638] children 665 rtkit-daemon [ 6396.170638] children 671 polkitd [ 6396.170638] children 711 udisksd [ 6396.170639] children 761 upowerd
over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

No soy un experto en desarrollo de sistemas Linux, pero intentaré ayudar en función de lo que veo que intentas.

Primero, no lo menciona en su pregunta, pero claramente está ejecutando algún tipo de habilitación de Systemd. Como sabe, Systemd normalmente no es compatible con WSL. En un nivel alto, los scripts para habilitar Systemd en WSL tienen dos funciones esenciales:

  • Cree un nuevo espacio de nombres PID donde Systemd se ejecuta como PID1. En el nivel más básico, esto se puede hacer a través de:

     sudo -b unshare --pid --fork --mount-proc /lib/systemd/systemd --system-unit=basic.target

    Podemos ver el no unshare en la lista de procesos devueltos, por lo que se está llamando, al menos.

  • Espere a que Systemd se inicie completamente, luego ingrese el espacio de nombres que se creó anteriormente. Esto es típicamente algo como:

     sudo -E nsenter --all -t $(pgrep -xo systemd) $SHELL

    Los scripts reales suelen ser un poco más complicados para manejar múltiples shells, distribuciones, etc. También intentan preservar más del entorno WSL dentro del espacio de nombres para habilitar las características de interoperabilidad, como ejecutar Windows .exe . Pero el concepto central es siempre el mismo.

Entonces, adivinando aquí (nuevamente, como un tipo que no es desarrollador de sistemas), parece que:

  • kpid=find_get_pid(1) está devolviendo el proceso systemd dentro del espacio de nombres

  • pid_task(kpid, PIDTYPE_PID) devuelve la información de proceso "verdadera" del espacio de nombres raíz.

    Me parece que el código debe estar ejecutándose fuera del espacio de nombres, ya que ves el no unshare como parte de él. Desde dentro del espacio de nombres, el no unshare no existe. Puede verificar esto (dentro del espacio de nombres) con ps -ef | grep unshare .

Hay al menos dos posibles soluciones:

  • Si no es un problema (y de los comentarios, no lo fue), simplemente ejecute su código desde el espacio de nombres del pid raíz. Supongo que su secuencia de comandos Systemd se ejecuta a través de sus archivos de inicio de shell, por lo que debería poder volver al espacio de nombres raíz iniciando con algo como wsl ~ -e bash --noprofile --norc . Esto iniciará el shell sin ninguno de los scripts de inicio.

    Por supuesto, otras técnicas para deshabilitar el script Systemd probablemente estén documentadas por cualquier script que esté utilizando.

  • Si desea que su código funcione correctamente desde un espacio de nombres PID, probablemente necesite encontrar el espacio de nombres (comenzaría con la fuente de lsns como ejemplo). Luego busque la estructura de la tarea dentro de ese espacio de nombres (¿probablemente find_task_by_pid_ns ?).

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda