- 浏览: 153588 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lyaqys:
lz实现的OptimisticExclusiveLock有点问 ...
java park/unpark 【java并发】基于JUC CAS原理,自己实现简单独占锁
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!
#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!
发表评论
-
c语言链表实现学生管理
2013-10-28 14:13 901#include<stdio.h> #includ ... -
简单的linux -c http-client
2013-10-23 15:35 4726#include<stdio.h> #includ ... -
毗连“"aa"”和“"bb"”不能给出一个有效的预处理标识符,gcc编译错误表
2013-10-01 18:54 2995gcc bug : ##’ cannot appear at ... -
负数转化为整数
2013-10-01 12:02 1354负数转化为整数 int a = -1321313; 12 ... -
STDIN_FILENO的作用及与stdin 的区别
2013-09-08 14:48 906if(NULL == fgets(msg,100,stdi ... -
linux进程cpu资源分配命令nice,renice,taskset
2013-09-04 14:03 1163nice,renice 指定进程运行的优先级 taskset ... -
c++ 动态内存分配
2013-08-28 22:35 845先看一段代码: [cpp] view plaincopy ... -
文件结束符EOF,system("stty raw")
2013-08-14 10:47 1557>> 关于文件结束符EOF EOF 是 End O ... -
c 专家编程
2013-08-13 17:06 690总结: -2> int * a = NUL ... -
Linux中线程与CPU核的绑定
2013-08-09 15:15 2128最近在对项目进行性能 ... -
建议编译的时候加警告 atof
2013-08-07 20:46 712#include <stdlib.h> ... -
feodra 17 安装 chrome
2013-08-04 01:35 7681: 下载:http://www.google.cn/chro ... -
Sudo提权出现:xx用户不在 sudoers 文件中
2013-08-03 20:22 913Sudo提权出现:xx用户不在 sudoers 文件中 症状 ... -
c语言api
2013-07-31 21:06 678原型:extern int isalnum(int c); 用 ... -
c 语言无符号类型使用注意,类型升级
2013-07-30 14:37 626#define SS sizeof(int) 5 int ... -
select,epoll,poll比较
2013-07-28 17:13 684select,poll,epoll简介 se ... -
gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数
2013-07-22 22:45 902我们用gcc编译程序时,可能会用到“-I”(大写i),“-L” ... -
Linux下如何将进程绑定在特定的CPU上运行
2013-07-22 10:52 990Linux下如何将进程绑定在特定的CPU上运行? 以root用 ... -
linux运维常用命令
2013-07-13 20:40 886推荐一个实用命令:awk '{x+=$2} END {prin ... -
linux 进程通信方式
2013-07-07 20:46 621# 管道( pipe ):管道是一种半双工的通信方式,数据只能 ...
相关推荐
总结起来,管道通信是操作系统中进程间通信的一个重要方法,它不仅限于父子进程,也可以在有共同祖先的进程之间共享。通过这个实验,我们加深了对管道机制的理解,并学会了如何在实际编程中应用它。
2. **父子进程通信**:在Linux中,父子进程可以共享资源,如内存映射区域,也可以通过特定机制进行通信,如管道、消息队列、共享内存或socket。本项目选择socket作为通信手段,因为它能提供更灵活的数据格式和更高的...
`pipe()`函数创建一个管道,允许父子进程或兄弟进程之间传递数据,而`socket()`则用于网络通信。 文件系统是Linux中的重要组成部分,`stat()`和`fstat()`函数能获取文件的元信息,`chmod()`和`chown()`改变文件权限...
1. **管道(Pipes)**:无名管道是半双工的,数据只能单向流动,适用于父子进程之间的简单通信。 2. **命名管道(Named Pipes/FIFOs)**:命名管道是全双工的,允许两个无亲缘关系的进程间通信。 3. **共享内存**...
在Linux中,通过`pipe()`函数可以创建一个管道,然后通过`fork()`创建的父子进程之间就可以通过这个管道进行通信。父进程写入数据,子进程读取数据,或者反过来,根据实际需求进行设计。 实验中,你需要结合`fork()...
管道通信是早期的、简单但有效的进程间通信(IPC,Inter-Process Communication)方式,尤其适用于父子进程或兄弟进程之间的数据传递。 首先,我们需要理解什么是进程。在操作系统中,进程是程序的一次执行实例,每...
匿名管道则仅适用于有亲缘关系的进程(如父子进程、兄弟进程)之间的通信。管道通信中,数据通过读写端口进行传输,文件描述符在创建管道时即已确定。 3. **信号量通信机制**:信号量用于解决多进程间的同步和互斥...
在Linux系统中,进程间通信(IPC,Inter-Process Communication)允许不同进程之间共享数据、交换信息,以实现协同工作。管道(Pipe)和有名管道(Named Pipe,也称为FIFO)是早期的IPC形式,它们为进程间的信息传递...
- **实验目标**:通过匿名管道实现父子进程间的简单数据交换。 - **实验步骤**: - 创建两个匿名管道`fd1`和`fd2`。 - 使用`fork()`函数创建一个子进程。 - 在子进程中关闭无用的管道端口,然后读取从父进程发来...
在本实验中,我们使用 wait() 系统调用来实现父子进程的同步。当父进程试图从一空管道中读取数据时,便进入等待状态,直到子进程将数据写入管道返回后,才将其唤醒。 七、实验结果 实验结果显示,父进程可以正确地...
父进程和子进程共享创建的管道。 3. 关闭不必要的管道端口:每个进程根据自己的需求关闭不需要的管道端。例如,读进程关闭写端,写进程关闭读端,以防止意外的数据流。 4. 重定向标准输入/输出:利用`dup2()`函数...
实验要求实现父子进程间的同步和管道的互斥使用,通过`lockf()`实现管道的加锁写入,确保每次只有一个进程写入。同时,通过`wait()`确保父进程在子进程写入数据后才读取,保证了数据的正确传递。 实验的程序流程...
其中,管道又分为普通管道(只能单向通信且通常用于父子进程间)、流管道(支持双向通信)和命名管道(可在任意不相关进程间通信)。这些通信机制各有优势和限制,适用于不同的场景和需求。 2. 分布式进程间通信...
父子进程间的通信可以通过管道、套接字、共享内存等方式实现。 3. **信号处理**:信号是Linux中进程间通信的一种机制,用于通知进程发生了特定事件。例如,SIGINT用于处理Ctrl+C中断信号,SIGTERM用于请求进程优雅...
管道的创建通常依赖于`fork()`系统调用,新旧进程共享管道连接,然后各自关闭不需要的端口。 在Linux中,管道通过VFS(虚拟文件系统)的索引节点和file结构实现。两个file结构分别代表读和写端,它们指向同一个临时...
4. **进程管理**:了解进程的生命周期,学习ps、pgrep、kill和killall等命令用于查看和控制进程,理解父子进程关系及进程间通信(IPC)方式,如管道、信号、共享内存和消息队列。 5. **网络基础**:熟悉TCP/IP协议...
- **应用场景**: 用于父子进程之间的通信。 ##### 13. `getpriority` 获取调度优先级 - **功能**: 获取进程或进程组的优先级。 - **应用场景**: 调整进程的优先级以优化系统资源分配。 ##### 14. `setpriority` ...