在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);
}