1、线程间通信(参考安卓源码InputTransport.cpp)
#include <pthread.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <stdio.h> #include <unistd.h> static const size_t SOCKET_BUFFER_SIZE = 32 * 1024; void *pthread_1(void *arg) { int fd = *((int *)arg); char buf[512]; int len; int cnt = 0; while (1) { len = sprintf(buf, "hello, main pthread, cnt = %d", cnt++); write(fd, buf, len); len = read(fd, buf, 500); buf[len] = ‘\0‘; printf("%s\n", buf); sleep(5); } return NULL; } int main(int argc, char **argv) { int sockets[2]; pthread_t thread_id; if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets)) { printf("socketpair error\n"); return -1; } int bufferSize = SOCKET_BUFFER_SIZE;
/* 创建4个buff, sockets[0]的发送buff和接收buff; sockets[1]的发送buff和接收buff*/ setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize)); setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize)); setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); int res = pthread_create(&thread_id, NULL, pthread_1, (void *)(&sockets[1])); if (res) { printf("pthread_create error\n"); return -1; } int fd = sockets[0]; char buf[512]; int len; int cnt = 0; while (1) { len = sprintf(buf, "hello, pthread1, cnt = %d", cnt++); write(fd, buf, len); //将buf中的内容通过fd句柄发送到snd buff len = read(fd, buf, 500); //通过读fd中的rcv buff, 将内容读到buf中,然后打印出来 buf[len] = ‘\0‘; printf("%s\n", buf); sleep(5); } return 0; }
打印信息:
再打开一个终端查看进程:ps -A 查看socketpair的pid为6065
cd /proc/6065
ls task
2、父子进程间通信
需要注意的是fd == 0是子进程,fd > 0 是父进程
#include <unistd.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <stdio.h> #include <unistd.h> static const size_t SOCKET_BUFFER_SIZE = 32 * 1024; int main(int argc, char **argv) { int sockets[2]; if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets)) { printf("socketpair error\n"); return -1; } int bufferSize = SOCKET_BUFFER_SIZE; setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize)); setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize)); setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); pid_t fd = fork();if (fd == 0) { /* 子进程 */ int fd = sockets[1]; char buf[512]; int len; int cnt = 0; while (1) { len = sprintf(buf, "hello, father pid, cnt = %d", cnt++); write(fd, buf, len); len = read(fd, buf, 500); buf[len] = ‘\0‘; printf("%s\n", buf); sleep(5); } } if (fd > 0) { /* 父进程 */ int fd = sockets[0]; char buf[512]; int len; int cnt = 0; while (1) { len = sprintf(buf, "hello, child pid, cnt = %d", cnt++); write(fd, buf, len); len = read(fd, buf, 500); buf[len] = ‘\0‘; printf("%s\n", buf); sleep(5); } } return 0; }
运行结果:
查看进程:ps -A 有2个名为fork的进程
原文:https://www.cnblogs.com/zhu-g5may/p/10555238.html