Skip to content

Instantly share code, notes, and snippets.

@mattconnolly
Created August 31, 2013 11:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mattconnolly/6397688 to your computer and use it in GitHub Desktop.
Save mattconnolly/6397688 to your computer and use it in GitHub Desktop.
zeromq forking - child process terminates inherited zeromq context
//
// main.c
// zmq-test1
//
// Created by Matt Connolly on 8/08/2013.
//
//#include <ZeroMQ/zmq.h>
#include <czmq.h>
const char* address = "tcp://127.0.0.1:6571";
void my_handler(int, siginfo_t *info, void *uap);
zctx_t* context;
int main(int argc, const char * argv[])
{
int rc;
printf("parent process: %d\n", getpid());
struct sigaction action;
action.sa_flags = SA_SIGINFO;
action.sa_mask = 0;
sigemptyset(&action.sa_mask);
action.sa_sigaction = &my_handler;
// action.sa_sigaction = NULL;
rc = sigaction(SIGCHLD, &action, NULL);
assert(rc == 0);
context = zctx_new();
void* sock = zsocket_new(context, ZMQ_PULL);
zsocket_bind(sock, address);
// ensure io threads are running before fork
sleep(1);
pid_t child_pid = fork();
if (child_pid == 0)
{
// child process
printf("child: process id = %d\n", (int)getpid());
sleep(1);
zctx_destroy(&context);
printf("child: destroyed context inherited from parent\n");
sleep(1);
void* ctx2 = zmq_ctx_new();
void* sock = zmq_socket(ctx2, ZMQ_PUSH);
zmq_connect(sock, address);
const char* message = "hello";
int i;
for (i = 0; i < 9; i += 1) {
printf("child: send message\n");
zmq_send(sock, message, strlen(message), 0);
usleep(1);
}
zmq_close(sock);
zmq_ctx_destroy(ctx2);
printf("child: destroyed child context\n");
printf("child: done\n");
exit(0);
}
else
{
// parent process
char* buffer;
zframe_t* frame;
int i = 0;
int received_count = 0;
while (received_count < 3)
{
printf("parent waiting for message #%d...\n", i++);
frame = zframe_recv(sock);
if (frame) {
received_count += 1;
buffer = zframe_strdup(frame);
printf("Received: %s\n", buffer);
free(buffer);
zframe_destroy(&frame);
}
else {
printf("recv interrupted!\n");
}
}
printf("parent: closing socket\n");
zsocket_destroy(context, sock);
zctx_destroy(&context);
printf("parent: done\n");
}
return 0;
}
void my_handler(int signal, siginfo_t *info, void *uap)
{
printf("signal %d received, from child pid %d!\n", signal, info->si_pid);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment