今天OS课程的上机实验是关于进程,线程,死锁的实验。昨天已经作好了第一个,不过今天在windows下的一个服务器上操作,所以就把线程的实验又做了一次。虽然昨天已经运行成功不过还有些地方没弄明白。今天在重新敲代码的时候终于明白了整个程序的流程。
这个程序的流程是这样的:通过对主函数传递参数来决定创建子进程的个数,不过最大不能超过MAX——CHILD——NUMBER,其实超过也会自动修改。接下来的for循环中,根据fork()函数创建子进程,这里便根据上篇日志中提到的利用其返回指来判断父、子进程执行什么内容。子进程是需要无限循环“做点什么”,直到有人将其杀死。这里便要用到另外一个很基本的系统调用函数kill()。
这个函数的定义是int kill(pid_t pid,int sig),其实就是将sig信号发送给pid进程。其中比较特殊的是pid=0的时候会将信号传送给与当前进程同组的所有进程。下面的程序用到的是信号
SIGTERM。
创建完子进程后,所有子进程便会并发执行do_something(),而且会一直执行下去,他们需要我们进行一一杀死,然后输入q退出。
起初还在想这个for(;;)是否是老师让我们去弥补完整,现在明白应该是为了测试kill()到底能不能发挥威力而故意使用的。
PS.今天进行上机还算顺利,这阵子让我渐渐熟悉在vim上进行linux世界当中的生活。还有其他两个实验,等完全搞定再来写点东西吧。
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <ctype.h>
#define MAX_CHILD_NUMBER 10 /*允许最大进程个个数*/
int proc_number=0;/*子进程的编号*/
void do_something();
int main(int argc,char* argv[])
{
int child_proc_number=MAX_CHILD_NUMBER;
int i;
char ch;
pid_t child_pid;
pid_t pid[10]={0}; /*这个数组是用来存放子进程的pid*/
if(argc>1)
{
child_proc_number=atoi(argv[1]);/*将字符串转换成整形*/
child_proc_number=((child_proc_number>10)?MAX_CHILD_NUMBER:child_proc_number);/*简单的判断进程个数的函数*/
}
for(i=0;i<child_proc_number;i++)
{
child_pid=fork();/*从这里开始创建子进程*/
if(child_pid==0)
{
proc_number=i;
do_something();
}
else if(child_pid>0)
{
pid[i]=child_pid;
printf("I am parent process and my child's PID is %d\n",child_pid);
}
}
while((ch=getchar())!='q')
{
if (isdigit(ch))
{
kill(pid[ch-'0'],SIGTERM);/*杀死第ch个进程*/
printf("!!!!The %d child process whose PID is %d was killed.\n",ch-'0',pid[ch-'0']);
}
}
return 0;
}
void do_something()
{
for(;;)
{
printf("I am %d child process and my PID is %d\n",proc_number,getpid());
sleep(5);
}
}
|
阅读(1827) | 评论(1) | 转发(0) |