`

linux系统父子进程共享端口

阅读更多
nginx 就是使用了父子进程 共享端口,所以nginx快速这个也算一个原因

#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

int main()
{
int sfp,nfp;
struct sockaddr_in s_add,c_add;
int sin_size;
unsigned short portnum=8888;

printf("Hello,welcome to my server !\r\n");
sfp = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sfp)
{
    printf("socket fail ! \r\n");
    return -1;
}
printf("socket ok !\r\n");


bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=htonl(INADDR_ANY);
s_add.sin_port=htons(portnum);

if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
{
    printf("bind fail !\r\n");
    return -1;
}
printf("bind ok !\r\n");

if(-1 == listen(sfp,5))
{
    printf("listen fail !\r\n");
    return -1;
}
printf("listen ok\r\n");

fork();
while(1)
{
sin_size = sizeof(struct sockaddr_in);

nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);
printf("\t\t\t\t\t\tprocess is %ld\n",(long)getpid());
if(-1 == nfp)
{
    printf("accept fail !\r\n");
    return -1;
}
printf("accept ok!\r\nServer start get connect from %#x : %#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));


if(-1 == write(nfp,"hello,welcome to my server \r\n",32))
{
    printf("write fail!\r\n");
    return -1;
}
printf("write ok!\r\n");
close(nfp);

}
close(sfp);
return 0;
}

客户端
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

int main()
{
int cfd;
int recbytes;
int sin_size;
char buffer[1024]={0};  
struct sockaddr_in s_add,c_add;
unsigned short portnum=8888;

printf("Hello,welcome to client !\r\n");

cfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == cfd)
{
    printf("socket fail ! \r\n");
    return -1;
}
printf("socket ok !\r\n");

bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr= inet_addr("127.0.0.1");
s_add.sin_port=htons(portnum);
printf("s_addr = %#x ,port : %#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port);


if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
{
    printf("connect fail !\r\n");
    return -1;
}
printf("connect ok !\r\n");

if(-1 == (recbytes = read(cfd,buffer,1024)))
{
    printf("read data fail !\r\n");
    return -1;
}
printf("read ok\r\nREC:\r\n");

buffer[recbytes]='\0';
printf("%s\r\n",buffer);

getchar();
close(cfd);
return 0;
}

分别多次运行客户端,可以发现显示的进程号是不同的

Hello,welcome to my server !
socket ok !
bind ok !
listen ok
process is 3277
accept ok!
Server start get connect from 0x7f000001 : 0xc67d
write ok!
process is 3278
accept ok!
Server start get connect from 0x7f000001 : 0xc681
write ok!
process is 3277
accept ok!
Server start get connect from 0x7f000001 : 0xc682
write ok!
process is 3278
accept ok!
Server start get connect from 0x7f000001 : 0xc683
write ok!

分享到:
评论

相关推荐

    实验四:Linux下进程管道通信.docx

    总结起来,管道通信是操作系统中进程间通信的一个重要方法,它不仅限于父子进程,也可以在有共同祖先的进程之间共享。通过这个实验,我们加深了对管道机制的理解,并学会了如何在实际编程中应用它。

    Linux下sokcet聊天进程版

    2. **父子进程通信**:在Linux中,父子进程可以共享资源,如内存映射区域,也可以通过特定机制进行通信,如管道、消息队列、共享内存或socket。本项目选择socket作为通信手段,因为它能提供更灵活的数据格式和更高的...

    Linux系统编程_v2.2.rar

    `pipe()`函数创建一个管道,允许父子进程或兄弟进程之间传递数据,而`socket()`则用于网络通信。 文件系统是Linux中的重要组成部分,`stat()`和`fstat()`函数能获取文件的元信息,`chmod()`和`chown()`改变文件权限...

    linux 网络编程 进程通信 信号量

    1. **管道(Pipes)**:无名管道是半双工的,数据只能单向流动,适用于父子进程之间的简单通信。 2. **命名管道(Named Pipes/FIFOs)**:命名管道是全双工的,允许两个无亲缘关系的进程间通信。 3. **共享内存**...

    操作系统实验——进程创建与进程间通信

    在Linux中,通过`pipe()`函数可以创建一个管道,然后通过`fork()`创建的父子进程之间就可以通过这个管道进行通信。父进程写入数据,子进程读取数据,或者反过来,根据实际需求进行设计。 实验中,你需要结合`fork()...

    进程的管道通信实验 操作系统 课程设计

    管道通信是早期的、简单但有效的进程间通信(IPC,Inter-Process Communication)方式,尤其适用于父子进程或兄弟进程之间的数据传递。 首先,我们需要理解什么是进程。在操作系统中,进程是程序的一次执行实例,每...

    Linux下进程间通信机制的探讨.pdf

    匿名管道则仅适用于有亲缘关系的进程(如父子进程、兄弟进程)之间的通信。管道通信中,数据通过读写端口进行传输,文件描述符在创建管道时即已确定。 3. **信号量通信机制**:信号量用于解决多进程间的同步和互斥...

    Linux环境进程间通信

    在Linux系统中,进程间通信(IPC,Inter-Process Communication)允许不同进程之间共享数据、交换信息,以实现协同工作。管道(Pipe)和有名管道(Named Pipe,也称为FIFO)是早期的IPC形式,它们为进程间的信息传递...

    Linux编程技术-实验3 进程之间的通信.docx

    - **实验目标**:通过匿名管道实现父子进程间的简单数据交换。 - **实验步骤**: - 创建两个匿名管道`fd1`和`fd2`。 - 使用`fork()`函数创建一个子进程。 - 在子进程中关闭无用的管道端口,然后读取从父进程发来...

    操作系统实验三进程的管道通信.doc

    在本实验中,我们使用 wait() 系统调用来实现父子进程的同步。当父进程试图从一空管道中读取数据时,便进入等待状态,直到子进程将数据写入管道返回后,才将其唤醒。 七、实验结果 实验结果显示,父进程可以正确地...

    linux进程间的通信:匿名管道

    父进程和子进程共享创建的管道。 3. 关闭不必要的管道端口:每个进程根据自己的需求关闭不需要的管道端。例如,读进程关闭写端,写进程关闭读端,以防止意外的数据流。 4. 重定向标准输入/输出:利用`dup2()`函数...

    进程的管道通信

    实验要求实现父子进程间的同步和管道的互斥使用,通过`lockf()`实现管道的加锁写入,确保每次只有一个进程写入。同时,通过`wait()`确保父进程在子进程写入数据后才读取,保证了数据的正确传递。 实验的程序流程...

    基于分布式网络的进程间通信系统设计与研究.pdf

    其中,管道又分为普通管道(只能单向通信且通常用于父子进程间)、流管道(支持双向通信)和命名管道(可在任意不相关进程间通信)。这些通信机制各有优势和限制,适用于不同的场景和需求。 2. 分布式进程间通信...

    linux

    父子进程间的通信可以通过管道、套接字、共享内存等方式实现。 3. **信号处理**:信号是Linux中进程间通信的一种机制,用于通知进程发生了特定事件。例如,SIGINT用于处理Ctrl+C中断信号,SIGTERM用于请求进程优雅...

    Linux进程间的通信方式和原理

    管道的创建通常依赖于`fork()`系统调用,新旧进程共享管道连接,然后各自关闭不需要的端口。 在Linux中,管道通过VFS(虚拟文件系统)的索引节点和file结构实现。两个file结构分别代表读和写端,它们指向同一个临时...

    史上最全的linux程序员面试资料

    4. **进程管理**:了解进程的生命周期,学习ps、pgrep、kill和killall等命令用于查看和控制进程,理解父子进程关系及进程间通信(IPC)方式,如管道、信号、共享内存和消息队列。 5. **网络基础**:熟悉TCP/IP协议...

    linux常用函数中文列表

    - **应用场景**: 用于父子进程之间的通信。 ##### 13. `getpriority` 获取调度优先级 - **功能**: 获取进程或进程组的优先级。 - **应用场景**: 调整进程的优先级以优化系统资源分配。 ##### 14. `setpriority` ...

Global site tag (gtag.js) - Google Analytics