2011-03-08 14 views

Respuesta

21

La forma más segura es utilizar snprintf y strtol.

Pero si sabe que ambos procesos se crearon usando la misma versión de compilador (por ejemplo, son el mismo ejecutable que fork ed), puede aprovechar el hecho de que cualquier cosa en C se puede leer o escribir como una matriz de char:

int n = something(); 
write(pipe_w, &n, sizeof(n)); 

int n; 
read(pipe_r, &n, sizeof(n)); 
+0

Cada puntero se puede lanzar a un * Char. Pero no estoy seguro si todo lo contrario es correcto sin violar las estrictas reglas de aliasing. –

+1

@cebewee: No estoy seguro de cuál es su pregunta. '(short *) (char *) & n' violará el aliasing estricto cuando se desreferencia. Pero 'short first_two_bytes; memcpy (& first_two_bytes, & n, sizeof (first_two_bytes)); 'no infringe el alias estricto. – aschepler

+1

@cebewee - No es char *, es nulo *. Y cada puntero puede ser un vacío *. Aunque es posible que aún tengas razón. Esto podría violar las reglas de aliasing estrictas y el valor de 'n' en el segundo caso podría no cambiar. – Omnifarious

1

Cualquiera de enviar una cadena que contiene la representación ASCII de número entero por ejemplo, 12345679, o enviar cuatro bytes que contienen la representación binaria de int, por ejemplo, 0x00, 0xbc, 0x61, 0x4f.

En el primer caso, usará una función como atoi() para recuperar el número entero.

0

La respuesta de Aschelpler es correcta, pero si esto es algo que puede crecer más tarde, le recomiendo usar algún tipo de biblioteca de protocolo simple como Google Protocol Buffers o solo JSON o XML con algunos esquemas básicos.

-2

A continuación se trabaja bien para escribir a la tubería y la lectura de la pipa como: salida

stop_daemon =123; 
res = write(cli_pipe_fd_wr, &stop_daemon, sizeof(stop_daemon)); 
.... 
res = read(pipe_fd_rd, buffer, sizeof(int)); 
memcpy(&stop_daemon,buffer,sizeof(int)); 
printf("CLI process read from res:%d status:%d\n", res, stop_daemon); 

:

CLI process read from res:4 status:123 
Cuestiones relacionadas