#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的更多相关文章

  1. linux信号量之进程间同步

    概念 linux信号量: 允许多个线程同时进入临界区,可以用于进程间的同步. 和互斥锁(mutex)的区别: 互斥锁只允许一个线程进入临界区. 所在头文件: semaphore.h 主要函数 初始化函 ...

  2. linux应用编程之进程间同步

    一.描述 在操作系统中,异步并发执行环境下的一组进程,因为相互制约关系,进而互相发送消息.互相合作.互相等待,使得各进程按一定的顺序和速度执行,称为进程间的同步.具有同步关系的一组并发进程,称为合作进 ...

  3. Linux系统编程—进程间同步

    我们知道,线程间同步有多种方式,比如:信号量.互斥量.读写锁,等等.那进程间如何实现同步呢?本文介绍两种方式:互斥量和文件锁. 互斥量mutex 我们已经知道了互斥量可以用于在线程间同步,但实际上,互 ...

  4. 一个进程间同步和通讯的 C# 框架

    转自原文 一个进程间同步和通讯的 C# 框架 threadmsg_demo.zip ~ 41KB    下载 threadmsg_src.zip ~ 65KB    下载 0.背景简介 微软在 .NE ...

  5. 使用 Mutex 实现进程间同步

    我们知道 Mutex 互斥量是可以用在线程间同步的,线程之间共享进程的数据,mutex 就可以直接引用.而进程有自己独立的内存空间,要怎样将它应用在进程间同步呢?为了达到这一目的,可以在 pthrea ...

  6. 一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)

    各位看官们.大家好,上一回中咱们说的是进程间同步与相互排斥的样例,这一回咱们说的样例是:使用信号量进行进程间同步与相互排斥. 闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,信号量是由著名 ...

  7. NET多线程之进程间同步锁Mutex

    Mutex类似于lock.Monitor,都是为了解决多线程环境下,资源竞争导致的访问顺序问题.常见资源竞争有以下情况: 1.单例,如何确保单例: 2.IO文件操作,如果同时又多个线程访问同一个文件会 ...

  8. python并发——进程间同步和通信

    一.进程间同步 对于一些临界资源,不能使用并发无限消耗,就需要设置专门的临界标示,比如锁或者信号量等 from multiprocessing import Process, Lock import ...

  9. Linux线程间同步的几种方式

    信号量 信号量强调的是线程(或进程)间的同步:"信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞 ...

随机推荐

  1. 论文阅读笔记(五)【CVPR2012】:Large Scale Metric Learning from Equivalence Constraints

    由于在读文献期间多次遇见KISSME,都引自这篇CVPR,所以详细学习一下. Introduction 度量学习在机器学习领域有很大作用,其中一类是马氏度量学习(Mahalanobis metric ...

  2. Python 序列化与反序列化

    序列化是为了将内存中的字典.列表.集合以及各种对象,保存到一个文件中(字节流).而反序列化是将字节流转化回原始的对象的一个过程. json库 序列化:json.dumps() 反序列化:json.lo ...

  3. yolo系列阅读笔记(v1-v3)

    yolov1 模型输出的概率建模 图片首先被分割为S*S的网格(grid cell).如果一个bbox的中心落在一个网格里,则该网格负责检测该物体.(对于pascal数据集,S定为7) 每个网格预测B ...

  4. Vs2013以管理员身份运行

    VS快捷方式目录下的devenv.exe 右键->兼容性疑难解答->疑难解答程序->勾选该程序需要附加权限即可,以后每次打开VS时都会以管理员身份运行了!

  5. jQuery---学习roadmap---4 parts

    jQuery---学习roadmap---4 parts jQuery初识 jQuery让js的开发变得更加简单 jQuery解决了浏览器的兼容性问题 学习目标 使用jQuery设计常见的效果 掌握j ...

  6. 使用TensorFlow训练模型的基本流程

    本文已在公众号机器视觉与算法建模发布,转载请联系我. 使用TensorFlow的基本流程 本篇文章将介绍使用tensorflow的训练模型的基本流程,包括制作读取TFRecord,训练和保存模型,读取 ...

  7. Django | mysql修改个别表后save()报错

    报错内容: elasticsearch.exceptions.ConnectionError: ConnectionError(<urllib3.connection.HTTPConnectio ...

  8. 题解【AcWing177】噩梦

    题面 考虑双向广搜. 我们需要记录男孩和女孩的当前位置,并且每次都进行扩展. 记录一个数组 \(st[i][j]\) . 如果 \(st[i][j]=0\) ,说明 \((i,j)\) 还没有被男孩和 ...

  9. oracle数据库操作 接口封装

    1.如下 using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using Sy ...

  10. 1-Django2.2安装指南

    django快速安装指南 作为一个Python Web框架,Django需要Python环境.下面是Django需要对应的python版本. Django版本 python版本 1.11 2.7, 3 ...