在socket(int domain,int type,int protocol)这个函数里,其中第一个参数指的是通信协议的协议族,其中AF_UNIX用于本地数据通信,它不用拆包组包,直接是将应用层的数据COPY至另一个进程。
僵尸进程:
子进程退出后,父进程没有wait或者waitpid,子进程还没有从进程表中删除,还占用系统的进程表,太多的进程表会导致系统崩溃,所以父进程要给子进程收尸。
代码:
服务端:
- #include <stdio.h>
- #include <sys/types.h>
- #include <signal.h>
- #include <sys/socket.h>
- #include <sys/un.h>
- #include <stdlib.h>
- #define SERVERNAME "myserver"
- void sig_chld(int signo)
- {
- pid_t pid;
- int stat;
- while((pid = waitpid(-1,&stat,WNOHANG))>0)
- printf("child %d terminated\n",pid);
- return;
- }
- int main(void)
- {
- struct sockaddr_un server,client;
- int serverfd,clientfd;
- char data[30];
- serverfd = socket(AF_UNIX,SOCK_STREAM,0);
- if(serverfd < 0){
- printf("error in socket\n");
- exit(0);
- }
- server.sun_family = AF_UNIX;
- strcpy(server.sun_path,SERVERNAME);
- unlink(SERVERNAME);
- if(bind(serverfd,(struct sockaddr*)&server,sizeof(server)) < 0){
- printf("error in bind\n");
- return 0;
- }
- listen(serverfd,5);
- signal(SIGCHLD,sig_chld);
- while(1){
- socklen_t socket_len = sizeof(client);
- clientfd = accept(serverfd,(struct sockaddr *)&client,&socket_len);
- if(clientfd < 0){
- printf("error clientfd\n");
- return 0;
- }
- pid_t pid;
- if((pid=fork())==0){
- read(clientfd,data,30);
- printf("\nrcv:%s\n",data);
- exit(0);
- }
- }
- unlink(SERVERNAME);
- return 0;
- }
客户端:
- #include <stdio.h>
- #include <sys/socket.h>
- #include <sys/un.h>
- #define SERVERNAME "myserver"
- int main(void)
- {
- struct sockaddr_un client;
- int fd;
- fd = socket(AF_UNIX,SOCK_STREAM,0);
- client.sun_family = AF_UNIX;
- strcpy(client.sun_path,SERVERNAME);
- bind(fd,(struct sockaddr *)&client,sizeof(client));
- int result = 0;
- result = connect(fd,(struct sockaddr *)&client,sizeof(client));
- if(result <0){
- printf("error in connect\n");
- return 0;
- }
- write(fd,"hello world",15);
- }