Skip to content

Instantly share code, notes, and snippets.

@yinyin
Created May 27, 2017 10:13
Show Gist options
  • Select an option

  • Save yinyin/0682a957450f7abb7f76603da2d3b8d5 to your computer and use it in GitHub Desktop.

Select an option

Save yinyin/0682a957450f7abb7f76603da2d3b8d5 to your computer and use it in GitHub Desktop.
Example of socketpair() function
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
void parent_process(int fd) {
int i;
fprintf(stderr, "FD of parent process: %d.\n", fd);
for (i = 0; i < 16; i++) {
ssize_t l;
int32_t r_buf;
int32_t w_buf;
w_buf = (int32_t)(i);
l = read(fd, &r_buf, sizeof(r_buf));
fprintf(stderr, "P: read (%d): %d\n", (int)(l), r_buf);
l = write(fd, &w_buf, sizeof(w_buf));
fprintf(stderr, "P: wrote (%d)\n", (int)(l));
}
close(fd);
}
void child_process(int fd) {
int i;
fprintf(stderr, "FD of child process: %d.\n", fd);
for (i = 0; i > -16; i--) {
ssize_t l;
int32_t r_buf;
int32_t w_buf;
w_buf = (int32_t)(i);
l = write(fd, &w_buf, sizeof(w_buf));
fprintf(stderr, "C: wrote (%d)\n", (int)(l));
l = read(fd, &r_buf, sizeof(r_buf));
fprintf(stderr, "C: read (%d): %d\n", (int)(l), r_buf);
}
close(fd);
}
int main(int argc, char ** argv) {
pid_t child_pid;
int socket_vector[2];
if(0 != socketpair(AF_UNIX, SOCK_STREAM, 0, socket_vector)) {
perror("cannot create socket pair");
return 2;
}
child_pid = fork();
if(-1 == child_pid) {
perror("cannot fork process");
return 2;
} else if (0 == child_pid) {
close(socket_vector[0]);
child_process(socket_vector[1]);
} else {
fprintf(stderr, "PID of child process: %d.\n", (int)(child_pid));
close(socket_vector[1]);
parent_process(socket_vector[0]);
}
return 0;
}
@neepoo
Copy link
Copy Markdown

neepoo commented Mar 4, 2022

thank you very much!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment