又开始上工程实践了,这次的内容是平时接触得比较少的Linux系统编程。一连七天,最终结课是完成一个基于主机系统的多客户即时通信/聊天室
先来看看课程涉及的主要内容。
本课程围绕构建一个基于主机系统的多客户即时通讯/聊天室项目展开:
涉及的理论知识
进程控制
:僵尸进程
/
孤儿进程、进程控制、守护,进程。。。
进程间通信
:管道、命名管道、信号。。。
多线程编程
:
锁、信号量。。。
围绕该软件的构建提炼
3
个基本实验
进程控制
进程间通信
多线程编程
综合案例分析
-
即时聊天系统实现
:采用所学的
OS
函数编程实现基于主机系统的多客户即时通讯
/
聊天室软件
这里只给出大概方向,如果读者有兴趣还请自行爬文
Day1 所学到的内容概括:
进程控制相关的系统调用
:
fork(),
getpid
(),
getppid
()
exit(),wait(),
waitpid
()
创建一个新的进程 – fork()
通过复制调用进程创建一个新的进程
返回值
子进程:
0
父进程:子进程的
pid
出错:
-1
僵尸进程的避免
1.
父进程通过
wait
和
waitpid
等函数等待子进程结束
2.
如果父进程很忙
,
可以用
signal
函数为
SIGCHLD
安装
handler,
因为子进程结束后
,
父进程会收到该信号
,
可以在
handler
中调用
wait
回收
3.
如果父进程不关心进程什么时候结束
,
那么可以用
signal(SIGCHLD,SIG_IGN)
通知内核
,
内核会回收
,
并不再给父进程发送信号
4.
Stevens
的两次
fork
避免僵尸进程
:
就是
fork
两次,父进程
fork
一个子进程,然后继续工作,子进程
fork
一个孙进程后退出,那么孙进程被
init
接管,孙进程结束后,
init
会回收。不过子进程的回收还要自己做
作业
1.
编例实现创建
n
个子进程
P1
,
P2
,
…
,
Pn
,
其中,各进程之间的关系是:
P1
是调用进程的子进程,
P(k+1)
是
Pk
的子进程。请打印各进程本身的进程号、父进程号,子进程号。要求每个父进程都要等待子进程退出后才能退出。
2.
编例实现创建
n
个子进程
P1
,
P2
,
…
,
Pn
,
其中,各进程之间的关系是:
P1
,
…,
Pn
都是调用进程的子进程。请打印各进程本身的进程号、父进程号,子进程号。要求每个父进程都要等待子进程退出后才能退出。
第一题
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
##include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
int main(){
pid_t pid;
int n=3;
int i;
int status;
for(i=0; i<n; i++){
pid = fork();
if(pid<0){
perror("fork is failed");
}
if(pid==0){
printf("I'm child process Id: %lu with parent process ID:%lu\n",(long)getpid(),(long)getppid());
}
if(pid>0){
printf("I'm parent process ID: %lu whit child process ID:%d \n",(long)getpid(),pid);
wait(&status);
break;
}
}
return 0;
}
第二题
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
##include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
int main(){
int n = 3;
pid_t pid;
int childNum = n;
int status;
printf("I'm parent process ,ID: %lu \n",(long)getpid());
for(n=0; n<3; n++){
pid = fork();
if(pid < 0){
perror("fork failed");
}
if(pid == 0) {
printf("I'm child process, ID: %lu with parent process ID: %lu \n",(long)getpid(),(long)getppid());
sleep(10);
exit(0);
}
}
while(1){
wait(&status);
childNum--;
if(childNum<=0){
break;
}
}