自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 资源 (2)
  • 收藏
  • 关注

原创 9.4 进程关系_进程组

      每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID,是一个正整数,并可存放在pid_t数据类型中。#include pid_t getpgrp(void);返回值:调用进程的进程组IDpid_t getpgid(pid_t pid);

2010-05-26 17:26:00 653

原创 如何解释 #define OFFSET(struct_type, member) ((size_t) &((struct_type *) 0)->member)

解释如下:(struct_type *) 0把一段地址看作struct_type;(struct_type *) 0)->member指向它的member成员&((struct_type *) 0)->member取这个成员的地址(size_t) &((struct_type *) 0)->member把地址硬转为size_t类型 测试代码如下:

2010-05-26 14:59:00 3852 2

转载 神奇的vfork

在论坛里看到下面一段代码:int createproc();int main(){   pid_t pid=createproc();   printf("%d/n", pid);   exit(0);}int createproc(){   pid_t pid;   if(!(pid=vfork())) {      p

2010-05-26 14:21:00 592

原创 8.16 进程控制_进程时间

#inclue clock_t times(struct tms *buf);返回值:若成功返回流逝的墙上的时钟时间(单位:时钟滴答数),若出错返回-1        我们可以测量三种时间:墙上时钟时间、用户CPU时间和系统CPU时间。任一进程都可调用times函数以获得它自己及已终止的子进程的上述值。所有由此函数返回的clock_t值都用_SC_CLK_TCK(由syscon

2010-05-26 10:29:00 329

转载 C语言18个经典问题答录

1.这样的初始化有什么问题?char *p = malloc(10); 编译器提示“非法初始式” 云云。答:这个声明是静态或非局部变量吗?函数调用只能出现在自动变量(即局部非静态变量) 的初始式中。因为静态变量的地址必须在编译的过程中就确定下来而malloc()申请的内存地址是在运行时确定的。2. *p++ 自增p 还是p 所指向的变量?答:后缀++ 和-- 操作符本质

2010-05-25 14:19:00 477

原创 8.13 进程控制_system函数

#includeint system(const char *cmdstring);      如果cmdstring是一个空指针,则仅当命令处理程序可用时,system返回非0值。      因为system在其实现中调用了fork、exec和waitpid,因此有三种返回值:如果fork失败或者waitpid返回除EINTR之外的出错,则system返回-1,而且e

2010-05-25 11:57:00 503

原创 8.11 进程控制_更改用户ID和组ID

      在UNIX系统中,特权是基于用户和组ID的。#include int setuid(uid_t uid);int setgid(gid_t gid);返回值:若成功则返回0,若出错则返回-1      setuid函数设置实际用户ID和有效用户ID,setgid函数设置实际组ID和有效组ID。      关于谁能更改ID有若干规则:若进程具有超级

2010-05-23 17:44:00 928

原创 8.10 进程控制_exec函数

       用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新进程则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是调用一个全新的程序替换了当前进程的正文、数据、堆和栈段。      用fork可以创建新进程,用exec可以执行新程序,exit

2010-05-21 17:08:00 488

原创 8.9 进程控制_竞争条件

      当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序时,则我们认为发生了竞争条件(race condition)。      如果一个进程要等待其父进程终止,则可以使用下列形式的循环:while(getppid() != 1)   sleep(1);这种形式的循环(称为轮询(polling))的问题是它浪费了CPU的时间,因为调用者每隔1秒都被

2010-05-21 16:22:00 515

原创 11.6 线程_线程同步

      除了计算机体系结构的因素以外,程序使用变量的方式也会引起竞争,也会导致不一致的情况发生。例如,可能会对某个变量加1,然后基于这个数值做出某种决定。增量操作这一步和做出决定这一步两者的组合并非原子操作,因而给不一致情况提供了可能。1.互斥量      可以通过使用pthread的互斥接口保护数据,确保同一时间只有一个线程访问数据。互斥量(mutex)从本质上说是一把锁,在访问共享

2010-05-20 14:32:00 790

原创 8.8 进程控制_wait3和wait4

      wait3和wait4提供的功能比wait、waitpid和waitid所提供的功能要多一个,这与附加参数rusage有关。该参数要求内核返回由终止进程及其所有子进程使用的资源汇总。#include #include #include #include pid_t wait3(int *statloc, int options, struct rusage *r

2010-05-18 16:41:00 4820

原创 8.7 进程控制_waitid

      waitid函数类似于waitpid,但提供了更多的灵活性。      #include int waitid(idtype_t idtype, id_t id, siginfo_t *infop. int options);返回值:成功返回0,出错返回-1      waitid允许一个进程指定要等待的子进程。但它使用单独的参数表示要等待的子进程的类型,而不是

2010-05-18 16:31:00 1662

原创 8.6 进程控制_wait和waitpid

      当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步事件,所以这种信号也是内核向父进程发的异步通知。      调用wait或waitpid的进程可能会发生什么情况:如果其所有子进程都还在运行,则阻塞。如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。如果它没有任何子进程,则立即出错返回。

2010-05-18 15:15:00 711

原创 8.5 进程控制_exit函数

      进程有下面5种正常终止方式:在main函数内执行return语句。这等效于调用exit。调用exit函数。其操作包括调用各终止处理程序(终止处理程序在调用atexit函数时登记),然后关闭所有标准I/O流等。调用_exit或_Exit函数。其目的是为进程提供一种无需运行终止处理程序或信号处理程序而终止的方法。对标准I/O是否进行冲洗,这取决于实现。进程的最后一个线程

2010-05-14 15:39:00 401

原创 8.4 进程控制_vfork函数

      vfork函数的调用序列和返回值与fork相同,但两者的语义不同。vfork用于创建一个新进程,而该新进程的目的是exec一个新程序。vfork与fork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中。相反,在子进程调用exec或exit之前,它在父进程的空间中运行。vfork和fork之间的另一个区别是vfork保证子进程先运行,在它调用exec或exit之后,

2010-05-14 14:04:00 375

原创 8.3 进程控制_fork函数

      一个现有的进程可以调用fork函数创建一个新进程。#include pid_t fork(void);子进程中返回0,父进程中返回子进程ID,出错返回-1      由fork创建的信进程被成为子进程。fork函数被调用一次,但返回两次。进程ID 0总是由内核交换进程使用,所以一个子进程的进程ID不可能为0。      子进程和父进程继续执行fork调用之后

2010-05-13 17:02:00 480

原创 8.2 进程控制_进程标识符

      每个进程都有一个非负整型表示的唯一进程ID。虽然是唯一的,但是进程ID可以重用。当一个进程终止后,其进程ID就可以再次使用了。      系统中有一些专用的进程,ID为0的进程通常是调度进程,常常被称为交换进程(swapper)。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程。进程ID1通常是init进程,在自举过程结束时由内核调用。此进程负责在自举内核后启

2010-05-13 16:49:00 811

原创 12.7 线程控制_取消选项

      可取消状态和可取消类型没有包含在pthread_attr_t结构中,这两个属性影响着线程在响应pthread_cancel函数调用时所呈现的行为(见11.5节)。#include int pthread_setcancelstate(int state, int *oldstate);      可取消状态属性可以是PTHREAD_CANCEL_ENABLE,也可以

2010-05-13 11:13:00 654

原创 15.9 进程间通信_共享存储

      因为数据不需要在客户进程和服务器进程之间复制,所以共享存储是最快的一种IPC。使用共享存储时要掌握的唯一窍门是多个进程之间对一给定存储区的同步访问。通常,信号量或记录锁被用来实现对共享存储访问的同步。#include int shmget(key_t key, size_t size, int flag);int shmctl(int shmid, int cmd, s

2010-05-11 17:07:00 584

原创 15.8 进程间通信_信号量

      信号量是一个计数器,用于多进程对共享数据对象的访问。为了正确地实现信号量,信号量的测试及减1操作应当是原子操作,为此,信号量通常是在内核中实现的。      XSI的信号量集的复杂性:      信号量集并非是单个非负值,而必须将其定义为含有一个或多个信号量(值)的集合。当创建一个信号量集时,要指定该集合中信号量(值)的数量。      创建信号量集(semget)与对

2010-05-10 17:33:00 341

原创 15.7 进程间通信_消息队列

      消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。每个消息包含一个正长整型类型之段,一个非负长度以及实际数据字节(对应于长度)。#include int msgget(key_t key, int flag);int msgctl(int msgid, int cmd, struct msqid_ds *buf);int msgsnd(int msqid,

2010-05-10 15:32:00 388

原创 15.6 进程间通信_XSI IPC

      有三种IPC称作XSI IPC,即消息队列、信号量以及共享存储器。      标识符是IPC对象的内部名。为使多个合作进程能够在同一IPC对象上会合,需要提供一个外部名方案。为此使用了键(key),每个IPC对象都与一个键相关联,于是键就用作为该对象的外部名。      ftok提供的唯一服务就是由一个路径名和项目ID产生一个键。#include key_t fto

2010-05-10 14:22:00 598

原创 15.5 进程间通信_FIFO

      FIFO有时被称为命名管道。通过FIFO,不相关的进程也能交换数据。FIFO是一种文件类型,创建FIFO类似于创建文件,FIFO的路径名存在于文件系统中。#include int mkfifo(const char *pathname, mode_t mode);      FIFO有下面两种用途:FIFO由shell命令使用以便将数据从一条管道线传送到另一

2010-05-07 15:32:00 385

原创 15.2 进程间通信_管道

      管道有下面两种局限性:它们是半双工(数据只能在一个方向上流动)。它们只能在具有公共祖先的进程之间使用。      管道是由调用pipe函数而创建的:#include int pipe(int filedes[2]);      经由参数filedes返回两个文件描述符:filedes[0]为读而打开,filedes[1]为写而打开。filedes[1]的输出是filedes[0]的输入

2010-05-06 15:47:00 434

原创 7.10 进程环境_setjmp和longjmp函数

      在C中,goto语句是不能跨越函数的,而执行这类跳转功能的函数是setjmp和longjmp。这两个函数对于处理发生在深层嵌套函数调用中的出错情况是非常有用的。      自动变量的存储单元在每个函数的栈帧中。      非局部指的是,这不是由普通C语言goto语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一个函数中。include

2010-05-05 12:38:00 522

原创 7.9 进程环境_环境变量

    ISO C定义了一个函数getenv,可以用其取环境量值,但是该标准又称环境的内容是由实现定义的。#include char *getenv(const char *name);返回值:返回指向与name关联的value的指针,若未找到则返回NULL    我们应当使用getenv从环境中取一个指定环境变量的值,而不是直接访问environ。#inclu

2010-05-03 17:32:00 1163

嵌入式资料整合第二辑

对当前的嵌入式技术的资料进行整合,对于想了解嵌入式技术和想知道怎样学嵌入式的朋友非常有帮助!

2010-05-10

嵌入式资料整合第一辑

对当前的嵌入式技术的资料进行整合,对于想了解嵌入式技术和想知道怎样学嵌入式的朋友非常有帮助!

2010-05-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除