#include "unistd.h"
#include "fcntl.h"
#include "stdlib.h"
#include "sys/select.h"
#include "stdio.h"
 
int main() {
	int master_fd = posix_openpt(O_RDWR | O_NOCTTY | O_NONBLOCK);
	char* slave_name = ptsname(master_fd);
	unlockpt(master_fd);
	grantpt(master_fd);
	printf("master_fd = %d, slave = %s\n", master_fd
, slave_name
);  
	// If omitted, select will start returning immediately without setting master_fd in fds after a client opens and closes slave ttys once
	int slave_fd = open(slave_name, O_RDONLY);
 
	fd_set fds;
	FD_ZERO(&fds);
 
	while (1) {
		FD_SET(master_fd, &fds);
 
		int ret = select(master_fd+1, &fds, NULL, NULL, NULL);
		printf("select ret = %d ", ret
); 		if (FD_ISSET(master_fd, &fds)) {
			char c = 0;
			int r = read(master_fd, &c, 1);
			printf("r = %d, c = '%c'\n", r
, c
); 			write(master_fd, &c, 1);
		} else {
			printf("master_fd is not set in fds\n"); 		}
	}
 
	return 0;
}
				I2luY2x1ZGUgInVuaXN0ZC5oIgojaW5jbHVkZSAiZmNudGwuaCIKI2luY2x1ZGUgInN0ZGxpYi5oIgojaW5jbHVkZSAic3lzL3NlbGVjdC5oIgojaW5jbHVkZSAic3RkaW8uaCIKCmludCBtYWluKCkgewoJaW50IG1hc3Rlcl9mZCA9IHBvc2l4X29wZW5wdChPX1JEV1IgfCBPX05PQ1RUWSB8IE9fTk9OQkxPQ0spOwoJY2hhciogc2xhdmVfbmFtZSA9IHB0c25hbWUobWFzdGVyX2ZkKTsKCXVubG9ja3B0KG1hc3Rlcl9mZCk7CglncmFudHB0KG1hc3Rlcl9mZCk7CglwcmludGYoIm1hc3Rlcl9mZCA9ICVkLCBzbGF2ZSA9ICVzXG4iLCBtYXN0ZXJfZmQsIHNsYXZlX25hbWUpOwoKCS8vIElmIG9taXR0ZWQsIHNlbGVjdCB3aWxsIHN0YXJ0IHJldHVybmluZyBpbW1lZGlhdGVseSB3aXRob3V0IHNldHRpbmcgbWFzdGVyX2ZkIGluIGZkcyBhZnRlciBhIGNsaWVudCBvcGVucyBhbmQgY2xvc2VzIHNsYXZlIHR0eXMgb25jZQoJaW50IHNsYXZlX2ZkID0gb3BlbihzbGF2ZV9uYW1lLCBPX1JET05MWSk7CgoJZmRfc2V0IGZkczsKCUZEX1pFUk8oJmZkcyk7CgoJd2hpbGUgKDEpIHsKCQlGRF9TRVQobWFzdGVyX2ZkLCAmZmRzKTsKCgkJaW50IHJldCA9IHNlbGVjdChtYXN0ZXJfZmQrMSwgJmZkcywgTlVMTCwgTlVMTCwgTlVMTCk7CgkJcHJpbnRmKCJzZWxlY3QgcmV0ID0gJWQgIiwgcmV0KTsKCQlpZiAoRkRfSVNTRVQobWFzdGVyX2ZkLCAmZmRzKSkgewoJCQljaGFyIGMgPSAwOwoJCQlpbnQgciA9IHJlYWQobWFzdGVyX2ZkLCAmYywgMSk7CgkJCXByaW50ZigiciA9ICVkLCBjID0gJyVjJ1xuIiwgciwgYyk7CgkJCXdyaXRlKG1hc3Rlcl9mZCwgJmMsIDEpOwoJCX0gZWxzZSB7CgkJCXByaW50ZigibWFzdGVyX2ZkIGlzIG5vdCBzZXQgaW4gZmRzXG4iKTsKCQl9Cgl9CgoJcmV0dXJuIDA7Cn0=