una traves servidor otra mensajes mensaje mandar enviar como c architecture command-line io

traves - Enviar mensajes al programa a través de la línea de comando



mandar mensaje a una ip (6)

Entonces, me puede estar faltando el punto aquí, pero por deafult la función principal de un programa C toma dos argumentos; argc, un recuento del número de argumentos (al menos uno) y argv (o vector arg), la lista de argumentos. Podría analizar los argumentos y llamar al método correcto. Por ejemplo:

int main(int argc, *argv[]) { /*loop through each argument and take action*/ while (--argc > 0) { printf(%s%s, *++argv, (argc > 1) ? " " : ""); } }

imprimiría todos los argumentos a la pantalla. No soy un gurú C, así que espero no haber cometido ningún error.

EDITAR: Ok, estaba buscando algo más, pero no estaba claro antes de que la cuestión fuera editada. No tienes que saltar en mi rep ...

Tengo este programa, lo llamaremos Host. Host hace todo tipo de cosas buenas, pero necesita poder aceptar entradas a través de la línea de comandos mientras se está ejecutando . Esto significa que de alguna manera debe enviar sus otros datos de proceso y luego abandonarlo. Por ejemplo, necesito poder hacer esto:

./Host --blahblah 3 6 3 5

Esto de alguna manera debería terminar llamando a alguna función en Host llamada

handleBlahBlah(int x1, int y1, int x2, int y2){ //do some more sweet stuff }

Host es un programa C y no necesita admitir instancias múltiples.

Un ejemplo de esto es el reproductor de música Amarok. Con Amarok corriendo y jugando, puede escribir "amarok --pause" y pausará la música.

Necesito poder hacer esto en Linux o Windows. Preferiblemente Linux.

¿Cuál es la forma más limpia de implementar esto?


Si estuviera en Windows, le diría que use una ventana oculta para recibir los mensajes, pero desde que usó ./ , supongo que quiere algo basado en Unix.

En ese caso, iría con un tubo con nombre . Sun tiene un tutorial sobre tuberías con nombre que podría ser útil.

El programa probablemente crearía la tubería y escucharía. Podría tener un script de línea de comandos separado que abriría el conducto y solo le haría eco de sus argumentos de línea de comando.

Puede modificar su programa para que admita el envío de línea de comandos en lugar de utilizar un script separado. Harías lo mismo básico en ese caso. Su programa vería los argumentos de la línea de comandos y, si corresponde, abrirá el conducto a la instancia "principal" del programa y enviará los argumentos.


Si necesita ser multiplataforma, puede considerar hacer que la instancia en ejecución escuche en un puerto TCP, y hacer que la instancia que inicie desde la línea de comando envíe un mensaje a ese puerto.


Sugiero usar un socket Unix o D-Bus . Usar un socket podría ser más rápido si está familiarizado con la programación de sockets de Unix y solo quiere algunas operaciones, mientras que D-Bus podría hacer que sea más fácil concentrarse en la implementación de la funcionalidad de una manera familiar orientada a objetos.

Eche un vistazo a la Guía de Beej para Unix IPC , particularmente el capítulo sobre conectores Unix .


Lo que nadie ha dicho aquí es esto: "no puedes llegar allí desde aquí".

La línea de comandos solo está disponible tal como estaba cuando se invocó su programa.

El ejemplo de invocar " fillinthename arguments ..." para comunicarse con fillinthename una vez que fillinthename se está ejecutando solo se puede lograr utilizando dos instancias del programa que se comunican entre sí.

Las otras respuestas sugieren formas de lograr la comunicación.

Un programa tipo amarok necesita detectar la existencia de otra instancia de sí mismo para saber qué función debe desempeñar, la función principal del receptor / servidor de mensajes persistentes o la función secundaria del remitente de mensajes de una sola toma.

editado para hacer que se muestre realmente la palabra fillinthename.


Una técnica que he visto es hacer que su programa de Host sea ​​simplemente un "caparazón" para su programa real. Por ejemplo, cuando ./Host tu aplicación normalmente (p. Ej .: ./Host ), el programa se integrará en la parte de la "aplicación principal" de tu código. Cuando inicia su programa de una manera que sugiere que desea señalizar la instancia en ejecución (por ejemplo: ./Host --send-message restart ), el programa se bifurcará en la parte del "remitente del mensaje" de su código. Es como tener dos aplicaciones en una. Otra opción que no usa fork es hacer que Host únicamente una aplicación de "mensaje remitente" y tener su "aplicación principal" como un ejecutable independiente (por ejemplo: Host_core ) que el Host puede iniciar por separado.

La parte de la "aplicación principal" de su programa deberá abrir algún tipo de canal de comunicación para recibir mensajes, y la parte del "remitente del mensaje" deberá conectarse a ese canal y usarlo para enviar mensajes. Hay varias opciones diferentes disponibles para enviar mensajes entre procesos. Algunos de los métodos más comunes son tuberías y enchufes . Dependiendo de su sistema operativo, puede tener opciones adicionales disponibles; por ejemplo, QNX tiene canales y BeOS / Haiku tiene BMessages . También es posible que pueda encontrar una biblioteca que recomponga esta funcionalidad, como lcm .