¿Cuál es el especificador printf correcto para imprimir pid_t?

3 minutos de lectura

Actualmente estoy usando un molde explícito a largo y usando %ld para imprimir pid_thay un especificador como %z por size_t por pid_t?

Si no, ¿cuál es la mejor manera de imprimir? pid_t?

  • Estoy obteniendo. %d hola.c:9:42: advertencia: el formato especifica el tipo ‘largo’ pero el argumento tiene el tipo ‘pid_t’ (también conocido como ‘int’) [-Wformat] cuando intento ld

    – Koray Tugay

    15 de junio de 2015 a las 15:34

  • @KorayTugay Tenga en cuenta las palabras anteriores: “Actualmente estoy usando un elenco explícito demasiado largo”.

    –Jim Balter

    30 de abril de 2016 a las 23:24

avatar de usuario
jim balter

No hay tal especificador. Creo que lo que estás haciendo (echar el pid_t para long e imprimirlo con "%ld") está bien; podría usar un tipo int aún más amplio, pero no hay implementación donde pid_t es mayor que long y probablemente nunca lo será.

  • Agradable. Si desea personalizar printf con su propia especificación para pid_techa un vistazo a esta página: stackoverflow.com/questions/9260170/…

    – Físico loco

    12 de diciembre de 2013 a las 1:59

  • ¿El número total de procesos está relacionado con la cantidad de bits del sistema operativo? por ejemplo, ¿puede un sistema operativo tener más tamaño de (int)?

    –Bilal Syed Hussain

    12 de diciembre de 2013 a las 2:13

  • Consulte stackoverflow.com/questions/1922761/… … pid_t suele ser de 32 bits, independientemente del tamaño de bits del sistema operativo. Un sistema pudo tienen más grandes, pero no lo esperaría. En cualquier caso, largo será suficiente para la seguridad.

    –Jim Balter

    12 de diciembre de 2013 a las 4:47

  • Hmmm, si pid_t suele ser de 32 bits, independientemente del tamaño de bits del sistema operativo. es cierto entonces en implementaciones donde long es de 64 bits, imprimiendo con un "%ld" sin duda causará problemas.

    – chux – Reincorporar a Monica

    23 dic 2019 a las 18:00

  • @chux-ReinstateMonica Lea la pregunta: “Actualmente estoy usando un molde explícito a largo y usar %ld” — eso es lo que dije “está bien”. Por supuesto, hay un problema con usar %ld sin garantizar que se está pasando un largo.

    –Jim Balter

    23 de diciembre de 2019 a las 23:05


avatar de usuario
chux – Reincorporar a Monica

Con tipos enteros que carecen de un especificador de formato coincidente como en el caso de pid_tpero con signo conocido1emitidos al tipo de letra y firma firmados más anchos.

Si no se conoce el signo para otro tipo de sistema, cambie al tipo sin signo más amplio u opinión alternativa

pid_t pid = foo();

// C99
#include <stdint.h>
printf("pid = %jd\n", (intmax_t) pid);

O

// C99
#include <stdint.h>
#include <inttypes.h>
printf("pid = %" PRIdMAX "\n", (intmax_t) pid);

O

// pre-C99
pid_t pid = foo();
printf("pid = %ld\n", (long) pid);

1
los pid_t tipo de datos es un entero con signo type que es capaz de representar un ID de proceso.

  • “Si no se conoce el carácter de signo, utilice el tipo sin signo más amplio”: no recomendaría esto. Casting a uintmax_t e impresión con %ju imprimirá todos los valores negativos incorrectamente, mientras que la conversión a intmax_t e impresión con %jd solo imprimirá valores > INTMAX_MAX incorrectamente. (Por otra parte, las situaciones en las que uno realmente no sabe si un tipo incluye valores negativos son bastante raras).

    –Jim Balter

    23 de diciembre de 2019 a las 23:46

  • @JimBalter Punto justo. Con el signo desconocido, existe la compensación de imprimir incorrectamente el valor negativo como valores grandes o los valores grandes como negativos. Esperaría que cuando se desconozca el signo, generalmente es más natural usar intmax_t ya que los valores pequeños son más comunes, pero la conversión entero con signo para uintmax_t tiene una definición más estrecha que no pierde información (de ahí mi preferencia) que entero sin signo para intmax_t lata. Elige tu veneno .

    – chux – Reincorporar a Monica

    24 de diciembre de 2019 a las 0:12

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad