printf(\fork,count=%d\\n\
result=fork(); if(result<0)
printf(\fail\\n\ else if(result>0) {
count++;
printf(\is parent!\\n”); } else {
count--;
printf(\is child!\\n\
}
printf(\fork count=%d\\n\ return 0; }
before fork,count=5 This is child after fork count=4 This is parent! after fork count=6 程序的执行过程如下:
程序先定义了两个变量result和count,然后输出变量count的值, 得到\fork count=5\这一行输出。当执行到result=fork()时程序分叉,产生父子两个进程。系统首先调度子进程执行,直至子进程结束。
而在子进程中result为0,故走的是条件分支的最后一个分支,输出: This is child. after fork count=4
子进程执行完了之后调度父进程执行,直至父进程结束。而在父进程中result为子进程号,大于0,于是走条件分支的第二个个分支,输出: This is parent after fork count=6 四、编程题
1、编写一个C语言源程序ex.c,(1)用以在打开当前目录下的文件
“ex.txt”,如果没有则创建该文件,并使其具有读写属性,(2)编写一个makefile实现自动编译,生成可执行文件ex。
void main(void) {
}
close(fid); }
objects = ex.o
exec = ex all:$(objects)
gcc –o $(exec) $(objects)
int fid;
fid = open(“./ex.txt”,O_RDWR|O_CREAT); if(fid==-1) {
printf(“open or create error \\n”); exit(0);
ex.o:ex.c
gcc –c ex.c
clean:
rm –r $(exec) $(objects)
2、假定你在目录/root/arm下有一个C程序,它由几个单独的文件组成,而这几个文件又分别包含了其他文件,如下图所示: 文件 main.c list.c symbol.c table.c table.h 包含文件 stdio.h, table.h list.h symbol.h table.h symbol.h, list.h 试编写makefile文件,最终的目标文件为ex1(交叉编译器为arm-linux-gcc)
CC=arm-linux-gcc
ex1: main.o list.o symbol.o table.o
$(CC) -o ex1 main.o list.o symbol.o table.o main.o: main.c table.h symbol.h list.h $(CC) -c -o main.o main.c list.o: list.c list.h $(CC) -c -o list.o list.c symbol.o: symbol.c symbol.h $(CC) -c -o symbol.o symbol.c table.o: table.c table.h symbol.h list.h
$(CC) -c -o table.o table.c clean:
rm ex *.o
五、简答题
1、什么是交叉编译?嵌入式交叉编译怎么实现? 2、Bootloader启动流程是怎么样的?
3、比较全缓冲、行缓冲和不带缓冲,并说明标准输入输出、标准错误各使用哪种类型的缓冲?
4、编写守护进程包括哪几个步骤,每个步骤分别怎么实现? 5、进程的信号与信号量通信有什么区别?
6、无名管道和有名管道在使用时有什么区别?分别使用什么函数创建无名管道和有名管道?