QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1426|回复: 5

一个简单程序的编写,请教~~~

[复制链接]
发表于 2006-6-25 11:02:01 | 显示全部楼层 |阅读模式
从LINUX教程看到这道题:
“使用系统调用fork( )创建两个子进程,使用系统调用signal()让父进程捕捉用alarm函数设置时钟的时间段终止时产生的信号,当捕捉到该信号后,父进程使用系统调用Kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出子进程被杀死信息后终止,父进程等待两个子进程终止后,输出父进程被杀死信息后终止程序。”
  试着做了一下,但没做出来。所以想请教一下大家~~~谢谢了
:D
发表于 2006-6-25 21:37:31 | 显示全部楼层
把你的代码贴出来,大家帮你分析。
回复

使用道具 举报

 楼主| 发表于 2006-6-29 15:29:12 | 显示全部楼层
#include<stdio.h>
#include<signal.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
int wait_mark=0;
void waiting()
        {while(wait_mark!=0);
}
void stop()
        {wait_mark=0;
}
mian(){
        pid_t p1,p2;
        while((p1=fork())==-1);
        if(p1>0)
                while((p2=fork())==-1);
                if(p2>0){
                        wait mark=1;
                        signal(SIGALRM,stop);
                        alarm(15);
                        waiting();
                        kill(p1,SIGALRM);
                        kill(p2.SIGALRM);
                        wait(10);
                        wait(10);
                        printf("parent....");
                }
                else
                        {
                        wait mark=1;
                        signal(SIGALRM,stop);
                        waiting();
                        printf("p1...");
                        exit(0);
                }
        wait mark=1;
        signal(SIGALRM,stop);
        waiting();
        printf("p2....");
        exit(0);
}
回复

使用道具 举报

 楼主| 发表于 2006-6-29 15:30:29 | 显示全部楼层
就是这个程序哈,到现在也没搞懂~~~请大家帮半忙~~~
回复

使用道具 举报

发表于 2006-6-29 22:47:31 | 显示全部楼层
#include<stdio.h>
#include<signal.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
int wait_mark=0;
void waiting()
{while(wait_mark!=0);
}
void stop()
{wait_mark=0;
}
main(){
pid_t p1=0,p2=0;   
while((p1=fork())==-1);
if(p1>0)         /*如果是父进程,就接着fork另一个子进程 p2 */
while((p2=fork())==-1);
if(p2>0){        /*p2要赋初值0,父进程执行if里面的代码*/
wait_mark=1;        /*使父进程在调用waiting()时,悬挂起来*/
signal(SIGALRM,stop);/*父进程收到SIGALRM时,退出waiting()函数*/
alarm(15);
waiting();/*waiting()悬挂15秒后会退出,然后执行后面的kill()*/
kill(p1,SIGALRM);
kill(p2,SIGALRM);
/*waitpid(p1);*/
wait(NULL);/*你以前的wait(10)是个错误的用法,它的参数应该是个地址,这里用两个wait()的方法总感觉不可靠,不过在我的电脑上已运行出正确的结果了*/
wait(NULL);
printf("parent....my child p1 is %d, my child p2 is %d\n",p1,p2);
}
/*在父进程中,p1,p2都大于0.   在p1子进程中,p1等于0,p2等于0.  在p2子进程中,p1大于0,p2等于0*/
else if(p1==0&&p2==0) /*这里要修改,否则两个子进程都执行else里面的代码,所以看到程序执行结果是p1...p1...,*/
{
wait_mark=1;
signal(SIGALRM,stop);
waiting();
printf("p1...p1=%d,  p2=%d,  i am p1, and my pid is%d,\n",p1,p2,getpid());
exit(0);
}
else   /*进行p2子进程*/
{
wait_mark=1;
signal(SIGALRM,stop);
waiting();
printf("p1...p1=%d,  p2=%d,  i am p2, and my pid is %d,\n",p1,p2,getpid());
exit(0);
}
}
回复

使用道具 举报

发表于 2006-6-29 22:51:03 | 显示全部楼层
p1...p1=3757,  p2=0,  i am p2, and my pid is 3758,
p1...p1=0,  p2=0,  i am p1, and my pid is3757,
parent....my child p1 is 3757, my child p2 is 3758

这是运行得到的结果
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 12:31 , Processed in 0.055924 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表