#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/select.h>
typedef struct _pipe_backed_thing_t {
int pipes[2];
char data[8192];
} pipe_backed_thing_t;
void *routine(void *arg) {
pipe_backed_thing_t *borrowed =
(pipe_backed_thing_t *) arg;
/* link does thing */
memcpy(borrowed
->data
, "hello world", sizeof("hello world") - 1);
/* if channel_is_observed_for_example() */
write(borrowed->pipes[1],
"\0", /* dummy packet null char */
sizeof(char));
return NULL;
}
int main(int argc, char** argv) {
pipe_backed_thing_t thing;
if (0 != pipe(thing.pipes)) {
}
/* 0 = read end, 1 = write end */
pthread_t thread;
if (0 != pthread_create(&thread, NULL, routine, (void*)&thing)) {
}
fd_set readfds;
int rfd = thing.pipes[0];
FD_ZERO(&readfds);
FD_SET(rfd, &readfds);
int ready = select(rfd + 1, &readfds, NULL, NULL, NULL);
if (ready == -1) {
}
if (FD_ISSET(rfd, &readfds)) {
char dummy;
read(rfd, &dummy, sizeof(dummy));
printf("got signal, data = %s\n", thing.
data); }
pthread_join(thread, NULL);
close(thing.pipes[0]);
close(thing.pipes[1]);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Cgp0eXBlZGVmIHN0cnVjdCBfcGlwZV9iYWNrZWRfdGhpbmdfdCB7CglpbnQgcGlwZXNbMl07CgljaGFyIGRhdGFbODE5Ml07Cn0gcGlwZV9iYWNrZWRfdGhpbmdfdDsKCnZvaWQgKnJvdXRpbmUodm9pZCAqYXJnKSB7CglwaXBlX2JhY2tlZF90aGluZ190ICpib3Jyb3dlZCA9CgkJKHBpcGVfYmFja2VkX3RoaW5nX3QgKikgYXJnOwoKCS8qIGxpbmsgZG9lcyB0aGluZyAqLwoJbWVtY3B5KGJvcnJvd2VkLT5kYXRhLCAiaGVsbG8gd29ybGQiLCBzaXplb2YoImhlbGxvIHdvcmxkIikgLSAxKTsKCgkvKiBpZiBjaGFubmVsX2lzX29ic2VydmVkX2Zvcl9leGFtcGxlKCkgKi8KCXdyaXRlKGJvcnJvd2VkLT5waXBlc1sxXSwKCQkiXDAiLCAvKiBkdW1teSBwYWNrZXQgbnVsbCBjaGFyICovCgkJc2l6ZW9mKGNoYXIpKTsKCglyZXR1cm4gTlVMTDsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CglwaXBlX2JhY2tlZF90aGluZ190IHRoaW5nOwoKCWlmICgwICE9IHBpcGUodGhpbmcucGlwZXMpKSB7CgkJZXhpdCgxKTsKCX0KCS8qIDAgPSByZWFkIGVuZCwgMSA9IHdyaXRlIGVuZCAqLwoKCXB0aHJlYWRfdCB0aHJlYWQ7CgoJaWYgKDAgIT0gcHRocmVhZF9jcmVhdGUoJnRocmVhZCwgTlVMTCwgcm91dGluZSwgKHZvaWQqKSZ0aGluZykpIHsKCQlleGl0KDEpOwoJfQoKCWZkX3NldCByZWFkZmRzOwoJaW50IHJmZCA9IHRoaW5nLnBpcGVzWzBdOwoKCUZEX1pFUk8oJnJlYWRmZHMpOwoJRkRfU0VUKHJmZCwgJnJlYWRmZHMpOwoKCWludCByZWFkeSA9IHNlbGVjdChyZmQgKyAxLCAmcmVhZGZkcywgTlVMTCwgTlVMTCwgTlVMTCk7CgoJaWYgKHJlYWR5ID09IC0xKSB7CgkJcGVycm9yKCJzZWxlY3QiKTsKCQlleGl0KDEpOwoJfQoKCWlmIChGRF9JU1NFVChyZmQsICZyZWFkZmRzKSkgewoJCWNoYXIgZHVtbXk7CgkJcmVhZChyZmQsICZkdW1teSwgc2l6ZW9mKGR1bW15KSk7CgkJcHJpbnRmKCJnb3Qgc2lnbmFsLCBkYXRhID0gJXNcbiIsIHRoaW5nLmRhdGEpOwoJfQoKCXB0aHJlYWRfam9pbih0aHJlYWQsIE5VTEwpOwoKCWNsb3NlKHRoaW5nLnBpcGVzWzBdKTsKCWNsb3NlKHRoaW5nLnBpcGVzWzFdKTsKCglyZXR1cm4gMDsKfQ==