#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. 02-SV数据类型

    1.数据类型 内建数据类型:逻辑(logic)类型.双状态数据类型(bit,byte,shortint,int,longint).四状态数据类型(integer,time,real) 其他:定宽数组. ...

  2. Wannafly Camp 2020 Day 2J 邦邦的2-SAT模板

    #include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; cout<<n& ...

  3. openlayers 保存当前地图View为图片

    /** * 保存地图为图片工具栏 */function addMapToolSavePicture() { var saveElement = document.createElement('a'); ...

  4. python package install error and little code bugs

    When you install packages using setup.py, the error: (py37) C:\Users\weda\Phd\python packages\visibi ...

  5. vue报错 [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's

    [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent c ...

  6. AntDesign(React)学习-12 使用Table

    AntDesign(Vue)版的Table中使用图片https://www.cnblogs.com/zhaogaojian/p/11119762.html 之前在使用VUE版Table时,使用大图片时 ...

  7. 0216 aop和打印数据库执行日志

    需求 maven依赖 <dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artif ...

  8. turtleh海龟库

    Turtle海龟库 导入 import turtle turtle.setup(width,height,startx,starty) -setup():设置窗体的位置和大小 相对于桌面的起点的坐标以 ...

  9. Django教程(1)

    增加新的视图: 1. 在app/view.py下增加调用视图函数 def horizonG(request): return render(request, 'horizonG.html') 2. 在 ...

  10. 使用imread()函数读取图片的六种正确姿势

    OpenCV实践之路——使用imread()函数读取图片的六种正确姿势 opencv里的argv[1]指向的文件在哪里 测试 #include "opencv2/highgui/highgu ...