#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. 区间无修改莫队学习笔记(lg1494小z的袜子)

    这几天感觉要学的要做的有点多,就偷了个懒没写笔记,赶紧补一下 莫队嘛,一个离线处理各种区间(或树上)询问的神奇算法 简单而言,按左端点排个序然后指针l,r递推就好了 复杂度证明貌似是不待修改的n^1. ...

  2. JS对象简介

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 让Surface Shader不受光照的明暗影响

    直接上码 Shader "Custom/3DVideo" { Properties { _Color (,,,) _MainTex ("Albedo (RGB)" ...

  4. CSS伪类before,after制作左右横线中间文字效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 巨杉Tech | 使用 SequoiaDB + Docker + Nodejs 搭建 Web 服务器

    容器化技术的出现大大简化了应用开发人员在构建底层基础设施的工作.SequoiaDB 巨杉数据库于3.2.1版本正式推出了 Docker 容器化部署方案,本文将会基于 SequoiaDB 巨杉数据库与N ...

  6. C# 后台调用http,post访问url,获取数据

    1.封装post方法发送 using System; using System.Collections.Generic; using System.IO; using System.Linq; usi ...

  7. JAVA 注解教程(四)Java 预置的注解

    @Deprecated 这个元素是用来标记过时的元素,想必大家在日常开发中经常碰到.编译器在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的方法.过时的类.过时的成员变 ...

  8. springboot中集成memcached

    前言 Memcached 是一个高性能的分布式内存对象缓存系统,其存储性能在某些方面不比redis差,甚至在文本类型数据的存储上性能略优于redis,本文将介绍如何在springboot中集成memc ...

  9. 实用 SQL 语句

    1. 创建 1.1 创建数据库 语法:create database db_name 示例:创建应用数据库 awesome_app sqlcreate database `awesome_app` 复 ...

  10. js面向对象的程序设计 --- 中篇(创建对象) 之 原型模式

    ·原型模式 我们创建的每一个函数都由一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有 实例共享的属性和方法. 如果按照字面意思来理解,那 ...