{
while(1){} } 5.
/*forktree.c*/ #include
if (p>0) /*如果是父进程*/ {
fork();
fork(); }
else{ /*如果是子进程*/ fork(); fork(); } sleep(50); }
要求:把程序编译,后台执行,利用ps命令查看进程的ID号,以进程的ID号为进程名称,画出程序的运行过程中产生的进程树。
6.
/*fork2.c */ #include
printf(\ else
printf(\ }
要求:写出程序的运行结果,并简要分析fork()系统调用创建子进程后,父进程和子进程之间的关系。
7. 编写程序代码,要求子进程利用execl()函数调用另一个可执行程序的代码。(要求: 把代码、程序编译和运行结果截图)
8. 分析程序执行流程,运行结果以及kill()和signal()的功能。
/*signal1.c*/ #include
i=0; } main( ) {
int k,j,pid; j=1;
while((pid=fork( ))==-1); if (pid>0) {
for(k=1;k<3;k++) {
printf(\sleep(1); }
kill(pid,17); /*发送软中断信号给子进程*/ wait(0); /*等待子进程终止*/ printf(\exit(0); } else {
signal(17,intfun); /*预置软中断信号17*/ i=1;
while(i==1) /*循环显示并等待父进程发软中断信号*/ {
printf(\ sleep(1); }
printf(\exit(0);
} }
9. 编写程序实现父进程和子进程基于无名管道进行通信。用系统调用pipe()建立一无名管道,父进程向管道写入一句话,子进程从无名管道中读出两个来自子进程的信息并显示。
(要求: 把代码、程序编译和运行结果截图)
10. 把下面程序空缺的语句填写完整,通过这个程序分析共享存储区通信机制的优缺点。
#include
#define SHMKEY 75 //定义符号变量,每个用户取不同的共享内存关键字值 int shmid,i; int *addr; //定义指向整型 变量的指针变量, main( )
{ while ((i=fork( ))==-1); if (!i) server( );
system(“ipcs -m”); while ((i=fork( ))==-1); if (!i) client( );
wait(0); wait(0);} void server( ) { ( 1 );
( 2 ); do
{ *addr=-1; system(“ipcs -m”); while (*addr==-1);
printf(\ }while (*addr);
( 3 );;
exit(0); }
void client( ) { int i; ( 4 );
( 5); for (i=9;i>=0;i--)