【笔记】Linux进程间同步和进程绑定至特定cpu
#define _GNU_SOURCE
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/mman.h>
#include <sys/epoll.h>
#include <sys/sysinfo.h>
#include <sched.h>
#include <stdlib.h> typedef struct mtx
{
pthread_mutex_t mutex;
pthread_mutexattr_t mutexattr;
} mtx; int main()
{
//获取cpu数量
printf( "get_nprocs_conf = %d, get_nprocs = %d\n", get_nprocs_conf(), get_nprocs() ); mtx* mm; //内存映射,匿名,进程间共享内存
mm=(mtx*)mmap( NULL, sizeof(mtx), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -, ); //初始化互斥锁属性
pthread_mutexattr_init(&mm->mutexattr);
pthread_mutexattr_setpshared(&mm->mutexattr, PTHREAD_PROCESS_SHARED); //设置互斥锁进程间共享,所有进程都能使用这个锁 pthread_mutex_init( &mm->mutex, &mm->mutexattr ); //初始化互斥锁 int socFd=socket( AF_INET, SOCK_STREAM, ); int fgetFd = fcntl( socFd, F_GETFL );
fgetFd|=O_NONBLOCK;
fcntl( socFd, F_SETFL, fgetFd ); struct sockaddr_in sock;
sock.sin_family=AF_INET;
sock.sin_addr.s_addr=inet_addr( "127.0.0.1" );
sock.sin_port=htons();
bind( socFd, ( struct sockaddr* )&sock, sizeof(sock) ); listen( socFd, ); int epolFd = epoll_create( );
struct epoll_event epEvent;
epEvent.events = EPOLLIN | EPOLLET;
epEvent.data.fd = socFd;
epoll_ctl( epolFd, EPOLL_CTL_ADD, socFd, &epEvent ); pid_t pid = fork(); cpu_set_t mask;
int num=;
if(pid!=)
{
CPU_SET( num, &mask ); //设置亲和力,父进程绑定到CPU0,taskset -p parent_pid_t 结果为1 01
}
else
{
++num;
CPU_SET(num, &mask); //子进程绑定到CPU1,taskset -p child_pid_t 结果为2 10
}
//设置进程亲和力,线程使用pthread_setaffinity_np()
if(sched_setaffinity( , sizeof(mask), &mask ) == -)
{
printf( "sched_setaffinity, pid = %d\n",pid );
} struct epoll_event arrEvent[]; while( )
{
int size = epoll_wait( epolFd, arrEvent, , - );
for(int i=; i<size; ++i)
{
if(arrEvent[i].data.fd==socFd)
{
if( pthread_mutex_trylock( &mm->mutex ) == )
{
printf("ppid = %d, pid = %d, locked\n", getppid(), getpid());
struct sockaddr_in client;
socklen_t clilen=sizeof(client);
int fd = accept( socFd, ( struct sockaddr * )&client, &clilen );
if( fd> )
{
fgetFd = -;
fgetFd = fcntl( fd, F_GETFL );
fgetFd|=O_NONBLOCK;
fcntl( fd, F_SETFL, fgetFd ); struct epoll_event eve;
eve.events=EPOLLIN | EPOLLET;
eve.data.fd=fd;
epoll_ctl( epolFd, EPOLL_CTL_ADD, fd, &eve );
} pthread_mutex_unlock( &mm->mutex );
}
} else
{
char buf[]={ };
while()
{
int len=read( arrEvent[i].data.fd, buf, sizeof(buf) );
if(len<=)
{
break;
} printf("ppid = %d, pid = %d, \n", getppid(), getpid());
write(arrEvent[i].data.fd, buf, len); }
epoll_ctl( epolFd, EPOLL_CTL_DEL, arrEvent[i].data.fd, NULL );
close( arrEvent[i].data.fd );
}
}
} pthread_mutex_destroy( &mm->mutex );
pthread_mutexattr_destroy( &mm->mutexattr );
munmap( ( void* )mm, sizeof( mtx ) );
close( socFd ); return ;
}
【笔记】Linux进程间同步和进程绑定至特定cpu的更多相关文章
- linux信号量之进程间同步
概念 linux信号量: 允许多个线程同时进入临界区,可以用于进程间的同步. 和互斥锁(mutex)的区别: 互斥锁只允许一个线程进入临界区. 所在头文件: semaphore.h 主要函数 初始化函 ...
- linux应用编程之进程间同步
一.描述 在操作系统中,异步并发执行环境下的一组进程,因为相互制约关系,进而互相发送消息.互相合作.互相等待,使得各进程按一定的顺序和速度执行,称为进程间的同步.具有同步关系的一组并发进程,称为合作进 ...
- Linux系统编程—进程间同步
我们知道,线程间同步有多种方式,比如:信号量.互斥量.读写锁,等等.那进程间如何实现同步呢?本文介绍两种方式:互斥量和文件锁. 互斥量mutex 我们已经知道了互斥量可以用于在线程间同步,但实际上,互 ...
- 一个进程间同步和通讯的 C# 框架
转自原文 一个进程间同步和通讯的 C# 框架 threadmsg_demo.zip ~ 41KB 下载 threadmsg_src.zip ~ 65KB 下载 0.背景简介 微软在 .NE ...
- 使用 Mutex 实现进程间同步
我们知道 Mutex 互斥量是可以用在线程间同步的,线程之间共享进程的数据,mutex 就可以直接引用.而进程有自己独立的内存空间,要怎样将它应用在进程间同步呢?为了达到这一目的,可以在 pthrea ...
- 一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)
各位看官们.大家好,上一回中咱们说的是进程间同步与相互排斥的样例,这一回咱们说的样例是:使用信号量进行进程间同步与相互排斥. 闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,信号量是由著名 ...
- NET多线程之进程间同步锁Mutex
Mutex类似于lock.Monitor,都是为了解决多线程环境下,资源竞争导致的访问顺序问题.常见资源竞争有以下情况: 1.单例,如何确保单例: 2.IO文件操作,如果同时又多个线程访问同一个文件会 ...
- python并发——进程间同步和通信
一.进程间同步 对于一些临界资源,不能使用并发无限消耗,就需要设置专门的临界标示,比如锁或者信号量等 from multiprocessing import Process, Lock import ...
- Linux线程间同步的几种方式
信号量 信号量强调的是线程(或进程)间的同步:"信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞 ...
随机推荐
- Django Form组件的扩展
Form组件扩展 1.用Form组件自带的正则扩展 通过Django内置的字段:Validators自定义验证规则 方式一: from django.forms import Form from dj ...
- Python之路Day08
文件操作 open() -- 打开 open通过Python控制操作系统打开文件 f=open('文件路径',mode='r',encoding='utf-8') mode -- 不写就默认是r f ...
- springboot整合websocket实现客户端与服务端通信
定义 WebSocket是通过单个TCP连接提供全双工(双向通信)通信信道的计算机通信协议.此WebSocket API可在用户的浏览器和服务器之间进行双向通信.用户可以向服务器发送消息并接收事件驱 ...
- Python警告:InsecureRequestWarning、InsecurePlatformWarning、SNIMissingWarning
SSL警告 urllib3将基于证书验证支持的级别发出几种不同的警告.这些警告表示特定情况,可以通过不同方式解决. InsecureRequestWarning 当在未启用证书验证的情况下对HTTPS ...
- QT安装和vs2015使用
下载Qt5.7.0安装包(qt-windows-opensource)与Qt插件(Visual Studio Add-in) QT软件下载地址: http://download.qt.io/archi ...
- php设计模式之策略模式实例代码
html <html> <head> <meta charset="UTF-8"> <title>简单计算器</title&g ...
- 题解【洛谷P5788】【模板】单调栈
题面 单调栈模板题. 单调栈与单调队列一样,都是维护了一段区间内的顺序. 然后--这个题用一个栈维护一下贪心就没了. 具体参考这一篇题解 #include <bits/stdc++.h> ...
- 【Python】程序计时
- Apache 安装概要
1.apache下载参照百度 bin文件夹下命令行: httpd -k install 2.安装完成后排错记录 服务无法启动,到bin目录下运行 httpd.exe 查看输出,然后百度一下输出即 ...
- Cadence Allegro小技巧之指定Gerber生成路径
Allegro生成Gerber数据时,默认会保存在与pcb文件相同目录路径下,Gerber数据本身就会生成好几个文件,然后与pcb文件,log文件,临时文件等混杂在一起,不易整理打包Gerber数据, ...