UNIX/Linux
字远尘
把简单的事做的不简单,把平凡的事做的不平凡
展开
-
APUE的小问题
查看下面的几个小例子,分析Linux中怎么区分参数的个数的(程序中设置了参数为2否则出错)Administrator@gzhang ~/gzhang/day09$ ./a.exe 1argv[1]=1read and writeAdministrator@gzhang ~/gzhang/day09$ ./a.exe 0 argv[1]=0read o原创 2015-06-09 16:10:44 · 267 阅读 · 0 评论 -
Linux--多线程访问全局变量互斥的例子
以下案例是两个线程同时访问一个全局worker变量,并分别对里面的成员counter进行增长#include #include #include #include #include #define MAX_NUM 5000typedef struct { int counter; pthread_mutex_t counter_mutex;}COUNTER;原创 2017-03-09 16:12:38 · 5747 阅读 · 0 评论 -
Linux--多线程读写锁问题
下面的案例是多个线程访问一个公共缓冲的处理,采用读写锁。需要注意的是代码中注释的地方。起初是将sleep放在unlock之前,这样的问题是,每次读线程读取完之后就直接睡眠导致写线程得到不到锁。由于写线程的写锁是独占的,需要保证读写锁没有被其他线程占用。#include #include #include #include #include pthread_rwlock_t原创 2017-03-09 18:06:13 · 432 阅读 · 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 · 2109 阅读 · 0 评论 -
Linux--多线程条件变量使用
条件变量是为了控制多线程的互斥问题,同时个人觉得有点多线程协作同步的意思在里面。消费者线程等待取生产者线程提供的资源,生产者线程生产产品后就通知唤醒消费者线程进行资源获取。一般条件变量与互斥量共用。#include #include #include #include #include typedef struct product_node{ char name[32]; i原创 2017-03-10 09:36:37 · 321 阅读 · 0 评论 -
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 · 606 阅读 · 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 · 1235 阅读 · 1 评论 -
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 · 540 阅读 · 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 · 200 阅读 · 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 · 462 阅读 · 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 · 1070 阅读 · 0 评论 -
关于fork的小问题
在阅读APUE的时候,试着在Cygwin中测试一个源程序,如下 1 #include 2 #include 3 #include 4 #include 5 6 #define MAXLINE 512 7 static void sig_int( int ); 8 int main ( int argc, char *argv[]原创 2015-05-26 10:28:59 · 636 阅读 · 0 评论 -
UNIX/Linux函数lseek说明
1. lseek返回当前文件所在位置距离文件开始处的偏移 lseek的原型 off_t lseek(int filedes, off_t offset, int whence); filedes:代表文件描述符 offset:通过第三个参数标记相对偏移量 whence:取值SEEK_SET(文件开始处),SEEK_CUR(文件当前原创 2015-06-04 18:16:51 · 1389 阅读 · 0 评论 -
Linux -- 文件I/O
Linux每个进程启动默认会打开三个文件描述符0, 1, 2,分别代表"标准输入", “标准输出”, “标准出错”。自然地,可以在程序中控制这三个文件描述符的开关闭。下面两个程序分别是“重定向标准输入到文件“和”标准输出到文件”1. 重定向标准输入到文件#include #include #include int main(){ int fd; close(STD原创 2017-02-09 17:15:05 · 226 阅读 · 0 评论 -
Linux -- fcntl修改文件状态标志
以下只是使用fcntl改变标准输入的阻塞模式,改成非阻塞的模式#include #include #include #include #include #include int main(int argc, char **argv){ char buffer[1024] = {0}; int flags; flags = fcntl(STDIN_FILENO, F_原创 2017-02-10 10:35:37 · 588 阅读 · 0 评论 -
Linux--多进程拷贝一个文件
下面程序是一个精简版的多进程拷贝文件,要求源文件是一个文件,而不是一个目录。程序注意点是,必须在创建进程后在进程中打开源和目的文件,否则,通过fork之后,多个进程会同时共享一个文件表项,导致读写文件混乱。由于每个进程分割地拷贝源文件的各个部分,所以不会出现写入文件混乱#include #include #include #include #include #includ原创 2017-03-01 18:00:15 · 2484 阅读 · 0 评论 -
Linux创建一个空洞文件
在使用迅雷下载的时候,查看迅雷新建的文件发现该文件大小和要下载的文件一样大其实迅雷事先在本地创建了一个与要下载一样大的临时文件,然后后面通过多线程方式从网络上下载这个文件,一点点填入那个临时文件创建空洞文件代码如下:#include #include #include #include #define N_M 10*1024*1024int main(int argc原创 2017-02-23 15:58:54 · 2279 阅读 · 0 评论 -
Linux--管道
1. 无名管道,只适用于有亲缘关系的进程之间通信#include #include /* Obtain O_* constant definitions */#include #include #include #define MAX_PATH 255/* server: 接受客户端发送过来的下载文件请求,如果文件存在,则直接把数据发送给客户端 如原创 2017-03-05 09:15:20 · 268 阅读 · 0 评论 -
Linux--多线程拷贝文件案例及其传参说明
下面的简单案例模拟了多线程拷贝一个文件#include #include #include #include #include #include #include #include #include #define MAX_PATH 255#define BLOCK_SIZE 4096typedef struct { int srcFd; int dstFd;原创 2017-03-08 17:41:26 · 1142 阅读 · 0 评论 -
Linux--线程,pthread_detach使用
需要注意的是,在线程中使用pthread_detach之后就不能用pthread_join了,否则会出现Invalid argument错误#include #include #include void *th_run(void *arg){ int n = 3; while(n--) { printf("thread run\n"); sleep(1); }}原创 2017-03-07 18:17:06 · 1494 阅读 · 1 评论