APUE
文章平均质量分 76
onlyou2030
内心仰望理想的人都在埋头苦干!
展开
-
变量存储类型
Turbo C2.0支持四种变量存储类型。说明符如下: auto static extern register下面分别来介绍。 一、auto 仅在语句块内部使用,初始化可为任何表达式,其特点是当执行流程进入该语句块的时候初始化可为任何表达式。 二、static static称为静态变量。根据变量的类型可以分为静态局部变量原创 2015-06-25 14:56:56 · 352 阅读 · 0 评论 -
信号量 互斥锁 条件变量的区别
信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。有的时候锁和信号量会同时使用的”也就是说,信号量不转载 2015-09-09 22:56:52 · 387 阅读 · 0 评论 -
linux线程2(简单笔试题)
题目:子线程循环10此,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环4次,试写出代码。#include #include #include #include pthread_attr_t attr; //属性pthread_mutex_t mutex; //互斥量pthread_cond_t cond;原创 2015-09-14 12:54:24 · 321 阅读 · 0 评论 -
linux线程1(一个简单的线程程序)
#include #include #include using namespace std;void *thread(void *threadid){ long tid; tid = (long)threadid; cout<<"Hello World! It's me, thread #"<<tid<<endl; pthread_exit(NULL);}int原创 2015-09-12 23:21:11 · 287 阅读 · 0 评论 -
linux线程4(google面试题)
题目:有四个线程1 2 3 4,线程1的功能就是输出1,线程2的功能就是输出2,以此类推.......现在有四个文件ABCD。初始都为空。现让四个文件呈如下格式:A:1 2 3 4 1 2 ...... B:2 3 4 1 2 3 ......C:3 4 1 2 3 4 ......D:4 1 2 3 4 1 ......请设计程序。原创 2015-09-15 14:28:56 · 377 阅读 · 0 评论 -
条件变量与互斥锁
一.互斥锁每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。二.条件变量条件变量是利用线程共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待“条件变量的成立”而挂起;另一个线程使“条件成立”(给出条件成立信号)(注意:此处的条件可以是我们取定的标志量,也可以是指针为空等等)。条件变量与互斥量一起使用时,允许线程以无竞争的原创 2015-09-14 15:35:41 · 598 阅读 · 0 评论 -
linux线程3(笔试题)
题目:编写一个程序,开启3个线程,这3个线程的ID分别为A B C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示。该程序用到POSIX信号量。#include #include #include #include #include pthread_t pidA,pidB,pidC;pthread_attr_t attr;sem_t se原创 2015-09-15 10:53:49 · 375 阅读 · 0 评论 -
linux线程6(CSDN论坛上很火的一个讨论贴)
有一个全局变量int sum=0运行两个线程,代码如下:for(int i=1;i<=50;i++) sum=sum+1;问两个线程都运行完后,sum的取值范围。本人虽然运行了n遍,结果都是100,但这是个概率事件,只是100的概率很大。博客中讨论出了多种结果,一些明显不对外,本人列出一些有说服力的结果,旨在理解多线程并发运行机制。第一种:50-100这种原创 2015-09-16 17:03:21 · 483 阅读 · 0 评论 -
linux线程5(百度知道上一道题)
题目:1+2+3+...+30000,在加的过程中,要使用3个多线程完成,并且全部计算好以后,得出最终的和数。原创 2015-09-15 14:31:33 · 307 阅读 · 0 评论 -
进程与线程
进程概念 进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。 在Mac、Windows NT等采用微内核结构的操作系统中,进程的功转载 2015-09-23 20:41:41 · 260 阅读 · 0 评论 -
用一个消息队列(System V)实现客户端-服务器端
#include#include#include#include#include#define KEY_MSG 0x101#define MSGSIZE 64typedef struct{ long mtype; char mtext[MSGSIZE];}msgbuf;#define LEN sizeof(msgbuf)-sizeof(long)void ma原创 2015-11-13 13:13:35 · 596 阅读 · 0 评论 -
linux线程7(manufacturer and consumer)
问题描述:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。首先假设简单的情况,生产者和消费者只有一个,原创 2015-09-29 19:19:03 · 357 阅读 · 0 评论 -
system V消息队列
#include #include #include #include int main(int argc,char **argv){ int c,oflag,mqid; oflag=IPC_CREAT|0666; //创建,且允许所有进程读写原创 2015-11-12 23:13:54 · 326 阅读 · 0 评论 -
leader-follower model
领导者-跟随者模型如下:有若干个线程(一般组成线程池)用来处理大量的事件有一个线程作为领导者,等待事件的发生;其他的线程作为追随者,仅仅是睡眠。假如有事件需要处理,领导者会从追随者中指定一个新的领导者,自己去处理事件。唤醒的追随者作为新的领导者等待事件的发生。处理事件的线程处理完毕以后,就会成为追随者的一员,直到被唤醒成为领导者。假如需要处理的事件太多,而线程数量不够(能够动态创建线程处理原创 2015-11-15 21:30:07 · 868 阅读 · 0 评论 -
fstream读写二进制文件
先从普通文件读数据,再将数据写到二进制文件,在将数据从二进制文件读出来,显示。中间包括插入数据,删除数据,都是直接对文件操作。涉及内容:标志位清除、读写文件指针重定位等#ifndef HARDWARE_H_#define HARDWARE_H_#include using namespace std;#define fileName "hardware.dat"#原创 2015-09-02 08:58:34 · 1383 阅读 · 0 评论 -
exec调用新程序
被调用程序:#include #include #include int main(int argc, char *argv[], char **environ){ int i; printf("I am a process image\n"); printf("My pid = %d, parentpid = %d\n", getpid(), getppid());原创 2015-08-16 15:23:23 · 439 阅读 · 0 评论 -
setjmp和longjmp
setjmp和longjmp.为了让你实现复杂的流控制,程序在系统里面运行完全依靠内存(代码段,全局段,堆存储器,栈存储器)和寄存器的内容(栈指针,基地址,计数器),setjmp保存当前的寄存器里面的内容,longjmp是恢复这些内容.longjmp返回setjmp程序当前的状态.#include int setjmp(jmp_buf env);保存当前寄存器的状态到env转载 2015-06-25 11:33:44 · 371 阅读 · 0 评论 -
函数fork和vfork
一个现有的进程可以调用fork函数创建一个新的进程。#include pid_t fork(void);返回值:子进程返回0,父进程返回子进程ID;若出错,返回-1 。fork函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新建子进程的进程ID。将子进程ID返回给父进程的原因是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得原创 2015-08-03 23:09:12 · 409 阅读 · 0 评论 -
关于err_sys未定义错误解决方法
err_sys以及err_quit等函数不是C语言自带函数,是作者自己编写的函数。所以,想要运行书中的源代码,就必须自建一个头文件my_err.h把作者的代码拷贝进去,然后在程序中加载,可以和apue.h放在一个路径下,然后在代码中加上#include "error.h"。下面是error.h的内容。#include errno.h> /* for defini原创 2015-08-07 21:29:34 · 4546 阅读 · 0 评论 -
APUE.3e 安装(基于ubuntu12.0.4)(转自涛哥)
本菜刚刚学习UNIX下高级编程,无奈搭建本书编程环境时遇到不少问题。幸好网上有各种大神的解决办法让我最终解决了问题。在这里感谢为LINUX开源操作系统奋斗的大神。不过话说回来,网上大都是针对UNIX高级编程第二版的头文件搭建,现在对于第三版来说,有些过时,因为很对针对linux的make文件已经改变了很多。话不多说,下面就来看看具体的搭建过程:(本人用的操作系统是ubuntu 14转载 2015-06-09 22:10:43 · 607 阅读 · 0 评论 -
linux下byte to byte 比较文件
#include #include #include #include #include #include #include using namespace std;#define SIZE 30#define BLOCKSIZE 4096char path1[SIZE];char path2[SIZE];size_t min(size_t a,siz原创 2015-08-26 21:43:09 · 657 阅读 · 0 评论 -
如何读写二进制文件
如果用getc或putc读写一个结构,那么必须循环通过整个结构,每次循环处理一个字节,这会非常麻烦。如果使用fputs和fgets,那么遇到null字节就会停止,而在结构中可能含有null字节,所以不能使用它实现读结构的要求。如果进行二进制I/O操作,每次可以读或者写一个完整的结构。#include size_t fread(void *restrict ptr,size_t si原创 2015-08-15 09:30:16 · 650 阅读 · 0 评论 -
C和C++文件操作区别
基于C的文件操作在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。一、流式文件操作这种方式的文件操作有一个重要的结构FILE,FILE在头文件stdio.h中定义如下:typedef struct {int level;unsigned flags;char fd;unsigned char hold;int原创 2015-08-15 10:01:36 · 1502 阅读 · 0 评论 -
进程环境
1.main函数 C程序总是从main函数开始执行。main函数的原型是:int main(int argc, char *argv[]);其中,argc是命令行参数的数目,argv是指参数的各个指针所构成的数组。当内核执行C程序时(使用exec函数),在调用main函数之前调用一个特殊的启动例程。可执行文件将此启动例程指定为程序的起始地址---这是由连接编辑器设置的,而连接编原创 2015-06-09 20:46:44 · 329 阅读 · 0 评论 -
fork()函数详解
一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来转载 2015-07-23 10:52:09 · 257 阅读 · 0 评论 -
exit与_exit
在linux的标准库函数中,有一套称作高级I/O的函数,我们熟知的printf 、fopen 、fread 、fwrite都在此列,他们也被称作缓冲I/O。其特征是对应每一个打开的文件,都存在一个缓冲区, 在内存中都有一片缓冲区,每次读文件会多读若干条记录,这样下次读文件时就可以直接从内存的缓存中取出,每次写文件时也仅仅是写入到内存的缓冲区,等待满足一定的条件(达到一定的数量,或者遇到特定字符,如转载 2015-08-16 16:55:18 · 293 阅读 · 0 评论 -
函数setjmp和longjmp
在C中,goto语句是不能跨越函数的,而执行这种类型跳转功能的是函数setjmp和longjmp。#include "apue.h"#define TOK_ADD 5void do_line(char *);void cmd_add(void);int get_token(void);int main(void){ char line[MAXLINE];原创 2015-08-03 19:38:27 · 395 阅读 · 0 评论 -
解释器文件
1.在/home/tian/UNIX/8-20文件夹下创建一个解释器文本testinterp#! /home/tian/UNIX/8-20/echoarg foo2.创建echoarg程序:#include "apue.h"int main(int argc,char *argv[]){ int i; for(i=0;i<argc;i++) printf("ar原创 2015-08-16 16:30:04 · 360 阅读 · 0 评论 -
linux下I/O缓冲
缓冲区作用:在实际编程中,I/O速度取决于显示器、键盘、硬盘等I/O设备的性能,而这些设备比起CPU和内存是比较慢的。因此系统采用缓冲区的方式来减少I/O的读写,以便提高系统性能。I/O的缓冲区的种类:1、无缓冲;2、行缓冲;3、全缓冲。一、行缓冲:看一个例子:[cpp] view plaincopy#incl转载 2015-08-16 17:04:09 · 303 阅读 · 0 评论 -
thread poll
转自:http://blog.csdn.net/hinyunsin/article/details/6650879/定义 什么是线程池?简单点说,线程池就是有一堆已经创建好了的线程,初始它们都处于空闲等待状态,当有新的任务需要处理的时候,就从这个池子里面取一个空闲等待的线程来处理该任务,当处理完成了就再次把该线程放回池中,以供后面的任务使用。当池子里的线程全都处理忙转载 2015-11-15 23:07:04 · 707 阅读 · 0 评论