socket

本文介绍了使用socket进行进程间通信的方法,特别是AF_UNIX在本地通信的应用,并通过示例代码展示了服务端如何处理客户端消息及如何避免僵尸进程的产生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自IPC——socket方式

在socket(int domain,int type,int protocol)这个函数里,其中第一个参数指的是通信协议的协议族,其中AF_UNIX用于本地数据通信,它不用拆包组包,直接是将应用层的数据COPY至另一个进程。


僵尸进程:

        子进程退出后,父进程没有wait或者waitpid,子进程还没有从进程表中删除,还占用系统的进程表,太多的进程表会导致系统崩溃,所以父进程要给子进程收尸。


代码:

   服务端:

  1. #include <stdio.h>  
  2. #include <sys/types.h>  
  3. #include <signal.h>  
  4. #include <sys/socket.h>  
  5. #include <sys/un.h>  
  6. #include <stdlib.h>  
  7.   
  8. #define SERVERNAME   "myserver"  
  9.   
  10. void sig_chld(int signo)  
  11. {  
  12.     pid_t pid;  
  13.     int stat;  
  14.   
  15.     while((pid = waitpid(-1,&stat,WNOHANG))>0)  
  16.         printf("child %d terminated\n",pid);  
  17.     return;  
  18. }  
  19.   
  20. int main(void)  
  21. {  
  22.     struct sockaddr_un server,client;  
  23.     int serverfd,clientfd;  
  24.     char data[30];  
  25.   
  26.     serverfd = socket(AF_UNIX,SOCK_STREAM,0);  
  27.     if(serverfd < 0){  
  28.         printf("error in socket\n");  
  29.         exit(0);  
  30.     }  
  31.     server.sun_family = AF_UNIX;  
  32.     strcpy(server.sun_path,SERVERNAME);  
  33.   
  34.     unlink(SERVERNAME);  
  35.       
  36.     if(bind(serverfd,(struct sockaddr*)&server,sizeof(server)) < 0){  
  37.         printf("error in bind\n");  
  38.         return 0;  
  39.     }  
  40.   
  41.     listen(serverfd,5);  
  42.     signal(SIGCHLD,sig_chld);  
  43.     while(1){  
  44.         socklen_t socket_len = sizeof(client);  
  45.         clientfd = accept(serverfd,(struct sockaddr *)&client,&socket_len);  
  46.   
  47.         if(clientfd < 0){  
  48.                 printf("error clientfd\n");  
  49.                 return 0;  
  50.         }  
  51.         pid_t pid;  
  52.         if((pid=fork())==0){  
  53.             read(clientfd,data,30);  
  54.             printf("\nrcv:%s\n",data);  
  55.             exit(0);  
  56.         }  
  57.   
  58.     }  
  59.   
  60.     unlink(SERVERNAME);  
  61.     return 0;     
  62. }  

客户端:
  1. #include <stdio.h>  
  2. #include <sys/socket.h>  
  3. #include <sys/un.h>  
  4.   
  5. #define SERVERNAME "myserver"  
  6.   
  7. int main(void)  
  8. {  
  9.     struct sockaddr_un client;  
  10.     int fd;  
  11.   
  12.     fd = socket(AF_UNIX,SOCK_STREAM,0);  
  13.   
  14.     client.sun_family = AF_UNIX;  
  15.     strcpy(client.sun_path,SERVERNAME);  
  16.   
  17.     bind(fd,(struct sockaddr *)&client,sizeof(client));  
  18.   
  19.     int result = 0;  
  20.     result = connect(fd,(struct sockaddr *)&client,sizeof(client));  
  21.     if(result <0){  
  22.         printf("error in connect\n");  
  23.         return 0;  
  24.     }  
  25.     write(fd,"hello world",15);  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值