C/C++
字远尘
把简单的事做的不简单,把平凡的事做的不平凡
展开
-
原子操作
说明原子操作是CPU提供的特性,不是每个CPU都支持,各个CPU的支持和底层实现并不一样,下面的例子只以Intel 架构来说明例子#include <stdio.h>#include <pthread.h>/* type __sync_fetch_and_add (type *ptr, type value, ...) __sync_fetch_and_add() / __sync_fetch_and_sub() / __sync_fetc原创 2021-01-05 14:57:49 · 178 阅读 · 0 评论 -
C++实现智能指针的简单案例
以下案例只是一个简单的小程序,实现过程中主要是将辅助计数类当做共有的属性#include using namespace std;template class adv_smart_pointer;template class ref_cnt{ friend class adv_smart_pointer;public: ref_cnt(T *p) : data_原创 2017-03-23 18:14:44 · 359 阅读 · 0 评论 -
Linux--守护进程
以下例子是创建一个守护进程,间隔5s在/tmp目录下写文件#include #include #include #include #include #include #include #include void daemonize(){ //1. 创建一个子进程,父进程退出,主要就是为setsid做准备 pid_t pid; pid = fork(); if (pi原创 2017-03-07 11:48:02 · 214 阅读 · 0 评论 -
Linux--setsid函数
调用setsid函数的进程需要满足以下条件:1. 不是组长进程2. 有对应的创建session权限调用setsid函数后的进程:1. 成为一个组的组长进程2. 成为一个会话的会话首进程3. 放弃了控制终端#include #include #include int main(int argc, char *argv[]){ pid_t pid原创 2017-03-07 11:14:28 · 558 阅读 · 0 评论 -
Linux--信号处理:在某个信号发生时屏蔽其他的信号
在下面代码中,在SIGINT信号处理过程中,屏蔽SIGQUIT信号的发生,信号SIGQUIT直到SIGINT的信号处理函数完毕后才能被处理#include #include #include #include #include void sig_handle(int signo){ int i = 5; printf("catch signal %d\n", (int)sig原创 2017-03-07 10:48:49 · 1253 阅读 · 1 评论 -
Linux--信号时序竞态
1. 有问题的mysleep函数,主要注释部分的解释#include #include #include #include #include void sig_handle(int signo){ }unsigned int mysleep(unsigned int nsec){ //int sigaction(int signum, const struct sig原创 2017-03-07 09:38:03 · 614 阅读 · 0 评论 -
Linux--父子进程同步协作
以下代码是父子进程交替打印变量counter的值。由于fork之后子进程会复制父进程的堆栈,信号处理函数,信号屏蔽字,在下面的程序会根据counter的不同初值进行分别。#include #include #include #include #include sigset_t newset, zeroset;static int counter = 1;static int s原创 2017-03-06 14:57:34 · 2120 阅读 · 0 评论 -
Linux--mmap实现进程间通信
服务端程序#include #include #include #include #include #include #include #include int main(int argc, char **argv){ static int couter = 0; if (argc != 2) { printf("usage: %s file_name\n",原创 2017-03-05 12:17:22 · 473 阅读 · 0 评论 -
Linux--简单copy程序
1. 测试main函数#include #include #include "copy.h"int main(int argc, char *argv[]){ if (argc != 3) { printf("usage: %s src dst\n", argv[0]); return -1; } char src[MAX_PATH] = {0}; char原创 2017-02-24 15:57:15 · 1106 阅读 · 0 评论 -
Linux--管道
1. 无名管道,只适用于有亲缘关系的进程之间通信#include #include /* Obtain O_* constant definitions */#include #include #include #define MAX_PATH 255/* server: 接受客户端发送过来的下载文件请求,如果文件存在,则直接把数据发送给客户端 如原创 2017-03-05 09:15:20 · 278 阅读 · 0 评论 -
Linux创建一个空洞文件
在使用迅雷下载的时候,查看迅雷新建的文件发现该文件大小和要下载的文件一样大其实迅雷事先在本地创建了一个与要下载一样大的临时文件,然后后面通过多线程方式从网络上下载这个文件,一点点填入那个临时文件创建空洞文件代码如下:#include #include #include #include #define N_M 10*1024*1024int main(int argc原创 2017-02-23 15:58:54 · 2298 阅读 · 0 评论 -
Linux--多进程拷贝一个文件
下面程序是一个精简版的多进程拷贝文件,要求源文件是一个文件,而不是一个目录。程序注意点是,必须在创建进程后在进程中打开源和目的文件,否则,通过fork之后,多个进程会同时共享一个文件表项,导致读写文件混乱。由于每个进程分割地拷贝源文件的各个部分,所以不会出现写入文件混乱#include #include #include #include #include #includ原创 2017-03-01 18:00:15 · 2499 阅读 · 0 评论 -
VC调试boost::asio::async_send_to时候的一个问题(_Debug_message assert的异常)
最近遇到一个奇怪的问题,在VS2010中调试BOOST::ASIO的时候会出现如题说明的异常,在网上找了一圈,有个哥们以前遇到过 http://bbs.csdn.net/topics/360059975,但是没给出解决方案。下面也没有给出解决方案,只是说明了使用方法代码中使用的是如下的语句:socket_.async_send_to(boost::asio::buffer( strSi原创 2016-09-19 16:00:37 · 3499 阅读 · 2 评论