2014025663《嵌入式系统程序设计》第五周学习总结
本周学习了fopen,fread,fclose,fwrite
1.作用
读写文件数据块。
2.函数原型
(1)size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
其中,ptr:指向保存结果的指针;size:每个数据类型的大小;count:数据的个数;stream:文件指针
函数返回读取数据的个数。
(2)size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
其中,ptr:指向保存数据的指针;size:每个数据类型的大小;count:数据的个数;stream:文件指针
函数返回写入数据的个数。
3.注意
(1)写操作fwrite()后必须关闭流fclose()。
(2)不关闭流的情况下,每次读或写数据后,文件指针都会指向下一个待写或者读数据位置的指针。
执行结果:
建立一个子进程。所建立的子进程PID 和 PPID不同于其父进程,同时资源使用被设置为0,文件锁和挂起的信号不被继承。
Linux内部,fork的执行使用copy-on-write页面,所以耗费的资源只是拷贝父进程页表,建立唯一子进程task结构体的时间和内存。
用法:
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
返回说明:
成功执行时,在父进程的线程执行中返回子进程PID,在子进程的线程执行中返回0。失败时在父进程的语境中返回-1,errno被设为以下的某个值
EAGAIN:
1.不能为拷贝父进程的页表和子进程的task结构分配足够的内存
2.不可能再建立新的子进程,因为调用者已达到RLIMIT_NPROC的资源限制,除了调用进程有CAP_SYS_ADMIN 或 CAP_SYS_RESOURCE的权限
ENOMEM:内核内存不足,无法分配必须的数据结构
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
int main(void)
{
pid_t pid;
printf("Before fork .../n");
switch(pid = fork()) {
case -1:
printf("Fock call fail/n");
exit(1);
case 0:
printf("The pid of child is: %d/n", getpid());
printf("The pid of child's parent is: %d/n", getppid());
printf("Child exiting.../n");
exit(0);
default:
printf("The pid of parent is: %d/n", getpid());
printf("the pid of parent's child is: %d/n", pid);
}
printf("After fork, program exiting.../n");
exit(0);
}
unix/linux管道通信相关函数
程序中有如下Linux系统调用: (1) fork( ):创建一个进程。 返回值:-1:创建子进程失败。 0 :子进程得到的返回值。 >0:父进程得到的返回值,表示子进程号(pid)。 创建子进程后,父、子进程执行同一个程序段,但有不同的数据区,子进程继 承父进程的资源。 (2) exit( ):撤消进程。 若父进程因wait()而睡眠,则唤醒父进程。exit()撤消子进程时必须通知父 进程。 (3) pipe(fd):创建一个管道. fd[0]为管道的读端,fd[1]为管道的写端。管道用来实现父进程与其子孙进程 之间的通信,以FIFO方式传送消息。 (4) wait():父进程等待子进程撤销。 若子进程尚未撤销,父进程睡眠等待,子进程撤销时,将其唤醒,若子进程已撤 销,父进程不睡眠等待。) (5) Sleep(n):进程睡眠等待 n 秒,交出处理机控制权。