上一页 1 ··· 37 38 39 40 41
摘要: #include <stdio.h>#include <stdlib.h>#include <signal.h>pid_t pid;void driver_handler(int signo) //司机的信号处理函数{ if (signo == SIGUSR1) printf("Let's go!\n"); if (signo == SIGUSR2) ... 阅读全文
posted @ 2013-03-08 18:49 dolinux 阅读(382) 评论(0) 推荐(0)
摘要: FILE *fp;int fd;fp = fopen(“1.c”, “r”);等价于 fd = open(“1.c”,O_RDONLY);fp = fopen(“1.c”, “r+“);等价于 fd = open(“1.c”, O_RDWR);fp = fopen(“1.c”, “w”); 等价于 fd = open(“1.c”, O_WRONLY | O_CREAT | O_TRUNC, 0666);fp = fopen(“1.c”, “w+”); 等价于 fd = open(“1.c”, O_RDWR | O_CREAT | O_TRUNC, 0666);fp = fopen(“1.c”, 阅读全文
posted @ 2013-03-08 18:43 dolinux 阅读(603) 评论(0) 推荐(0)
摘要: 假如在父进程中调用了标准IO,会在用户空间产生一个结构体,其中封装了文件IO返回的文件描述符fd,同时还有针对不同函数的输入输出缓冲区,与之对应的内核空间也有一个文件IO创建的结构体。所以,stdin、stdout和stderr都指向的是用户空间的那个结构体,类型是FILE *。当调用fork函数创建了子进程后,对于内核空间的那个结构体,子进程不会拷贝,但是对于用户空间的那个结构体,子进程会进行拷贝。即:子进程中的stdin、stdout和stderr的指向是与父进程中的stdin、stdout和stderr不同的(所以子进程的输入缓冲区与父进程的输入缓冲区不在一个位置,同理,他俩的输出缓冲区 阅读全文
posted @ 2013-03-08 12:35 dolinux 阅读(398) 评论(0) 推荐(0)
摘要: signal函数的原型是:void (*signal(int signum, void (*handler)(int)))(int);参数说明:signum:指定的信号其中函数指针handler的取值:SIG_IGN 忽略该信号SIG_DFL 采用系统默认方式处理信号自定义的信号处理函数指针其中的参数SIG_IGN和SIG_DFL是这样定义的:而__sighandler_t又是按下面的方式定义的:其中,__signalfn_t又是这样定义的:现在知道了,SIG_IGN和SIG_DFL是将1和0强制类型转换为了函数指针类型。下面分析一下signal的含义:首先,先看一下函数指针是怎么用的: vo 阅读全文
posted @ 2013-03-06 19:48 dolinux 阅读(830) 评论(0) 推荐(0)
摘要: 线程创建函数pthread_create的函数原型如下:int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);其中,thread是要创建的线程; attr指定线程的属性,缺省值为NULL; start_routine是线程要执行的函数; arg是传递给线程执行的函数的参数;要注意的是:start_routine是函数指针线程等待函数pthread_create的函数原型如下:int 阅读全文
posted @ 2013-03-06 09:10 dolinux 阅读(549) 评论(0) 推荐(0)
摘要: 思路:先创建一个父进程,然后在父进程中创建一个子进程,而在子进程中调用exec函数族,父进程所要做的只是等待子进程的结束,然后再次循环等待用户输入下一条命令。注:因为要模拟的是bash,所以在一条命令执行完成了后,执行命令的进程结束了,但是bash并没有结束(即不能在父进程中调用exec函数族,否则父进程也会结束,不符合实际),而是等待刚才输入的命令结束后,再次提示用户输入下一条命令,直到用户输入... 阅读全文
posted @ 2013-03-06 08:35 dolinux 阅读(294) 评论(0) 推荐(0)
摘要: 下面的完成了这样一个功能,创建一个守护进程,每个一秒在/tmp目录下的文件peng.txt中记录当前系统时间。一、守护进程守护进程是linux中的后台服务进程,在系统启动时开始运行,在系统关闭时终止。Linux系统中的大多数服务进程都是由守护进程实现的。二、创建守护进程创建子进程,父进程退出此时,子进程变成孤儿进程,在后台运行。此时,子进程表面上脱离了终端(如bash),但是实际上却没有,因为其PGID和SID都是原来的没变。在子进程中创建新的会话调用setsid()函数,这样,子进程的GID和sid就都等于子进程pid了,它使子进程完全独立出来,可以使用 kill –9 pid,将其杀死。改 阅读全文
posted @ 2013-03-05 20:58 dolinux 阅读(487) 评论(0) 推荐(0)
摘要: 下面用程序实现这样的功能:有一个文件的内容需要拷贝到另一个文件中,以前的做法是用一个进程来完成,下面要做的是,是两个进程同时做这件事,一个进程负责一半,如父进程负责拷贝文件的前半段,子进程负责拷贝文件的后半段。下面看一下程序的流程以及需要注意的问题: 其中 要注意的是当父进程调用fork函数创建子进程后,子进程同样也把父进程所打开的文件描述符fd拷贝过来,但是,在内核当中的struct file... 阅读全文
posted @ 2013-03-05 20:18 dolinux 阅读(870) 评论(0) 推荐(0)
摘要: 一、一个进程的构成 一个进程由正文段(即代码段)、用户数据段以及系统数据段。 其中系统数据段又称进程控制块(PCB),是给操作系统进行调度用的。系统数据段中存放了关于这个进程的:PID 、PPID、优先级、占用的资源、该进程的状态等等。 fork函数用于进程创建。 看下面一段代码 1: #include <stdio.h> 2: #include <unistd.h> 3:... 阅读全文
posted @ 2013-03-04 19:21 dolinux 阅读(457) 评论(0) 推荐(0)
摘要: 大小端的更多内容参见:详解大端模式和小端模式 第一种方法 思路:利用指针的强制类型转换 #include <stdio.h>int main(void){ int data1 = 0x12345678; int i; for(i=0; i<4; i++) { printf("%#x ----->%p\n",*((char *)&data1 + i),... 阅读全文
posted @ 2013-03-03 14:10 dolinux 阅读(350) 评论(0) 推荐(0)
摘要: 一、库和系统调用 操作系统内核提供的接口函数就是系统调用。 库是别人写好的现有的、成熟的,可以代码复用的代码,如C库,数学函数库等等。很多库中的函数是对内核提供的系统调用的封装。系统调用对内核的依赖性很大,都是Linux操作系统,如redhat 、Ubuntu,但是他们提供的系统调用有些是不同的,linux和windows的系统调用也不同看看维基百科如何解释:在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向操作系统内核请求需要更高权限运行的服务。 系统调用提供了用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态执行。如设备IO操作或者 阅读全文
posted @ 2013-03-03 11:50 dolinux 阅读(900) 评论(0) 推荐(1)
摘要: 第一种方法思路:将文件中的字符一个一个读出,然后与 \n 作比较。 1: #include <stdio.h> 2: #include <string.h> 3: #include <errno.h> 4: 5: 6: int main(int argc, char *argv[]) 7: { 8: FILE *fp; 9: int n = 0; 10: int ch; 11: 12: if((fp = fopen(argv[1],"r+")) == NULL) 13: { 1... 阅读全文
posted @ 2013-03-03 10:50 dolinux 阅读(399) 评论(0) 推荐(0)
摘要: 动态库和静态库 阅读全文
posted @ 2013-03-02 14:07 dolinux 阅读(456) 评论(0) 推荐(0)
上一页 1 ··· 37 38 39 40 41