#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
typedef void (*socket_handler)(int port);
void delay() {
for (int i = 0; i < 10; i++)
sleep(1);
}
// Create and handle tcp socket connections
void tcp_server(int port) {
// Just a delay to simulate a server
delay();
}
// Create and handle udp socket connections
void udp_server(int port) {
// Just a delay to simulate a server
delay();
}
int start_process(int port, socket_handler handler) {
pid_t pid;
pid = fork();
if (pid < 0) {
return -1;
}
if (pid == 0) {
// Starting handler
handler(port);
}
return pid;
}
int main(int argc, char *argv[]) {
pid_t tcp_pid = start_process(2222, tcp_server);
pid_t udp_pid = start_process(5555, udp_server);
printf("Process TCP pid: %d has started\n", tcp_pid
); printf("Process UDP pid: %d has started\n", udp_pid
);
// Simple way to finish both processes
do {
int status;
pid_t finished_pid = waitpid(-1, &status, 0);
printf("Process %d finished\n", finished_pid
);
if (finished_pid == tcp_pid)
tcp_pid = -1;
if (finished_pid == udp_pid)
udp_pid = -1;
} while (tcp_pid != -1 || udp_pid != -1);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvd2FpdC5oPgojaW5jbHVkZSA8c2lnbmFsLmg+Cgp0eXBlZGVmIHZvaWQgKCpzb2NrZXRfaGFuZGxlcikoaW50IHBvcnQpOwoKdm9pZCBkZWxheSgpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKICAgICAgICBzbGVlcCgxKTsKfQoKLy8gQ3JlYXRlIGFuZCBoYW5kbGUgdGNwIHNvY2tldCBjb25uZWN0aW9ucwp2b2lkIHRjcF9zZXJ2ZXIoaW50IHBvcnQpIHsKICAgIHByaW50ZigiVENQOiAlZFxuIiwgcG9ydCk7CgogICAgLy8gSnVzdCBhIGRlbGF5IHRvIHNpbXVsYXRlIGEgc2VydmVyCiAgICBkZWxheSgpOwoKICAgIGV4aXQoMCk7Cn0KCi8vIENyZWF0ZSBhbmQgaGFuZGxlIHVkcCBzb2NrZXQgY29ubmVjdGlvbnMKdm9pZCB1ZHBfc2VydmVyKGludCBwb3J0KSB7CiAgICBwcmludGYoIlVEUDogJWRcbiIsIHBvcnQpOwoKICAgIC8vIEp1c3QgYSBkZWxheSB0byBzaW11bGF0ZSBhIHNlcnZlcgogICAgZGVsYXkoKTsKCiAgICBleGl0KDApOwp9CgppbnQgc3RhcnRfcHJvY2VzcyhpbnQgcG9ydCwgc29ja2V0X2hhbmRsZXIgaGFuZGxlcikgewogICAgcGlkX3QgcGlkOwoKICAgIHBpZCA9IGZvcmsoKTsKICAgIGlmIChwaWQgPCAwKSB7CiAgICAgICAgcGVycm9yKCJmb3JrKCkiKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaWYgKHBpZCA9PSAwKSB7CiAgICAgICAgLy8gU3RhcnRpbmcgaGFuZGxlcgogICAgICAgIGhhbmRsZXIocG9ydCk7IAogICAgfSAKCiAgICByZXR1cm4gcGlkOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICBwaWRfdCB0Y3BfcGlkID0gc3RhcnRfcHJvY2VzcygyMjIyLCB0Y3Bfc2VydmVyKTsKICAgIHBpZF90IHVkcF9waWQgPSBzdGFydF9wcm9jZXNzKDU1NTUsIHVkcF9zZXJ2ZXIpOwogICAgCiAgICBwcmludGYoIlByb2Nlc3MgVENQIHBpZDogJWQgaGFzIHN0YXJ0ZWRcbiIsIHRjcF9waWQpOwogICAgcHJpbnRmKCJQcm9jZXNzIFVEUCBwaWQ6ICVkIGhhcyBzdGFydGVkXG4iLCB1ZHBfcGlkKTsKCiAgICAvLyBTaW1wbGUgd2F5IHRvIGZpbmlzaCBib3RoIHByb2Nlc3NlcwogICAgZG8gewogICAgICAgIGludCBzdGF0dXM7CiAgICAgICAgcGlkX3QgZmluaXNoZWRfcGlkID0gd2FpdHBpZCgtMSwgJnN0YXR1cywgMCk7CgogICAgICAgIHByaW50ZigiUHJvY2VzcyAlZCBmaW5pc2hlZFxuIiwgZmluaXNoZWRfcGlkKTsKCiAgICAgICAgaWYgKGZpbmlzaGVkX3BpZCA9PSB0Y3BfcGlkKQogICAgICAgICAgICB0Y3BfcGlkID0gLTE7CiAgICAgICAgaWYgKGZpbmlzaGVkX3BpZCA9PSB1ZHBfcGlkKQogICAgICAgICAgICB1ZHBfcGlkID0gLTE7CgogICAgfSB3aGlsZSAodGNwX3BpZCAhPSAtMSB8fCB1ZHBfcGlkICE9IC0xKTsKCiAgICByZXR1cm4gMDsKfQo=