Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20847
  • 博文数量: 3
  • 博客积分: 1420
  • 博客等级: 上尉
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-05 17:37
文章分类
文章存档

2008年(3)

我的朋友

分类:

2008-10-10 23:38:28

今天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);
    }
}

阅读(1771) | 评论(1) | 转发(0) |
0

上一篇:进程初步

下一篇:没有了

给主人留下些什么吧!~~

chinaunix网友2009-04-10 11:48:58

你是哪个学校的啊。。怎么和我情况完全一样。。也是今天os实验。。也是这题。。。同样是3个题目。。