int main(int argc, char *argv[]) { shr_key_t key; shr_t shr; shr_t revshr; ssize_t got = 1, wrote; pid_t pid; int closed = 0; size_t ptr, len; if (argc != 1) { fprintf(stderr, "See README for usage.\n"); return 1; } SHR_PRIVATE(&key, BUFFER_SIZE, 3); t (shr_open(&shr, &key, SHR_WRITE)); t (shr_reverse_dup(&shr, &revshr)); t (pid = fork()); if (pid) shr = revshr; while (!pid && got) { char* buf; t (shr_write(&shr, &buf)); t (got = read(STDIN_FILENO, buf, BUFFER_SIZE)); t (shr_write_done(&shr, (size_t)got)); } while (pid && !closed) { const char* buf; t (shr_read(&shr, &buf, &len)); for (ptr = 0; ptr < len;) { t (wrote = write(STDOUT_FILENO, buf, len)); ptr += (size_t)wrote; } t (closed = shr_read_done(&shr)); } shr_close(&shr); if (pid) shr_remove(&shr); return 0; fail: perror(called); shr_remove_by_key(&key); return 1; (void) argv; }
int main(int argc, char *argv[]) { shr_key_t key; shr_t shr; char str[SHR_KEY_STR_MAX]; char* buf; ssize_t got = 1; int r; struct timespec timeout = { .tv_sec = 0, .tv_nsec = 500000000L }; if (argc != 1) { fprintf(stderr, "See README for usage.\n"); return 1; } t (shr_create(&key, BUFFER_SIZE, 3, 0600)); t (shr_open(&shr, &key, SHR_WRITE)); shr_key_to_str(&key, str); t (printf("key: %s\n", str)); while (got) { called = "shr_write_try(&shr, &buf)"; r = shr_write_try(&shr, &buf); if (r < 0) { if (errno != EAGAIN) goto fail; fprintf(stderr, "\033[31mThe ring is full.\033[00m\n"); called = "shr_write_timed(&shr, &buf, &len, &timeout)"; for (;;) { r = shr_write_timed(&shr, &buf, &timeout); if (r == 0) break; if (errno != EAGAIN) goto fail; fprintf(stderr, "\033[31mWaiting...\033[00m\n"); } } t (got = read(STDIN_FILENO, buf, BUFFER_SIZE)); t (shr_write_done(&shr, (size_t)got)); } shr_close(&shr); return 0; fail: perror(called); shr_remove_by_key(&key); return 1; (void) argv; }
int main() { struct shr *s=NULL; int rc = -1; unlink(ring); if (shr_init(ring, 6, 0) < 0) goto done; s = shr_open(ring); if (s == NULL) goto done; printf("writing ..."); if (shr_write(s, &data[0], 3) < 0) goto done; printf("ok\n"); printf("reading ..."); ssize_t nr; nr = shr_read(s, out, sizeof(out)); if (nr < 0) goto done; printf("read %ld bytes\n", (long)nr); if (nr > 0) printf("%.*s\n", (int)nr, out); printf("writing ..."); if (shr_write(s, &data[3], 3) < 0) goto done; printf("ok\n"); printf("reading ..."); nr = shr_read(s, out, sizeof(out)); if (nr < 0) goto done; printf("read %ld bytes\n", (long)nr); if (nr > 0) printf("%.*s\n", (int)nr, out); rc = 0; done: printf("end\n"); if (s) shr_close(s); return rc; }
int main(int argc, char *argv[]) { shr_key_t key; shr_t shr; uid_t uid; gid_t gid; mode_t mode; if (argc != 2) { fprintf(stderr, "See README for usage.\n"); return 1; } uid = (uid_t)atoll(argv[3]); gid = (gid_t)atoll(argv[4]); mode = (mode_t)atoll(argv[5]); shr_str_to_key(argv[1], &key); t (shr_open(&shr, &key, SHR_READ)); t (shr_stat(&shr, &uid, &gid, &mode)); printf("buffer size: %zu\n", SHR_BUFFER_SIZE(&shr)); printf("buffer count: %zu\n", SHR_BUFFER_COUNT(&shr)); printf("owner: %lli\n", (long long)uid); printf("group: %lli\n", (long long)gid); printf("mode: %o\n", (int)mode); shr_close(&shr); shr_remove(&shr); return 0; fail: perror(called); shr_remove(&shr); return 1; }