QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 775|回复: 9

各位大侠进来帮小妹一个忙

[复制链接]
发表于 2004-12-14 14:19:09 | 显示全部楼层 |阅读模式
我写了一个linux进程间信号机制通信的实验
希望实现的功能:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按ctrl+c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
Child process1 is killed by parent!
Child process2 is killed by parent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parent process is killed!

代码如下:
#include<stdio.h>
#include<signal.h>
#include<unistd.h>

void waiting(),stop();
int wait_mark;
main()
{
int p1,p2,stdout;
while((p1=fork())==-1);
if(p1>0)
{
while((p2=fork())==-1);
if(p2>0)
{
wait_mark=1;
signal(SIGINT,stop);
waiting();
kill(p1,16);
kill(p2,17);
wait(0);
wait(0);

printf("parent process is killed!\n");
exit(0);
}
else
{
wait_mark=1;
signal(17,stop);
printf("%d",SIG_DFL);
waiting();
lockf(stdout,1,0);
printf("child process 2 is killed by parent!\n");
lockf(stdout,0,0);
exit(0);
}
}
else
{
wait_mark=1;
signal(16,stop);
printf("%d",SIG_DFL);
waiting();
lockf(stdout,1,0);
printf("child process 1 is killed by parent!\n");
lockf(stdout,0,0);
exit(0);
}
}


void waiting()
{
while(wait_mark!=0);
}

void stop()
{
wait_mark=0;
}


我加大的那几行肯定是有问题的 signal(sig,fuction)
fuction肯定不可能指向stop ,按道理来说应该指向kill(我认为)
可是我不知道怎么修改这个程序,我是这方面的新手,希望得到哪位大侠的帮助,得到我期望的程序输出!
(按我这样的写法,父进程就直接kill掉了,根本没有对两个子进程发送信号。
执行时按下ctrl+c只是出现:parent process is killed!)
发表于 2004-12-14 19:40:34 | 显示全部楼层
这不是shell相关的问题...
回复

使用道具 举报

发表于 2004-12-14 23:09:29 | 显示全部楼层
要实现你所说的功能,先要屏蔽子进程的键盘中断。如下
sigset_t* set = new sigset_t;
sigprocmask(0,0,set);//get the old signal mask work
sigaddset(set,SIGINT);//add the SIGINT mask
sigprocmask(0,set,0);//reset the subprocess signal mask
然后父进程等待键盘中断产生,然后给子进程发信号就行了。
父子进程间的等待可以如下实现(见《Unix环境高级编程》)
你如果实现过一个shell就知道这其实很简单。

#include <csignal>
#include <cstdio>
#include <sys/types.h>
#include <unistd.h>
#include "synchro.h"

void TELL_WAIT(void);
void TELL_PARENT(pid_t pid);
void WAIT_PARENT(void);
void TELL_CHILD(pid_t pid);
void WAIT_CHILD(void);
bool isSynchroAble(void);

static volatile sig_atomic_t sigflag;
static bool synchronismFlag = true;
static sigset_t newmask, oldmask, zeromask;
static void sig_usr(int signo);

static void sig_usr(int signo)
{
        sigflag = 1;
        return;
}

void TELL_WAIT(void)
{
        if(signal(SIGUSR1, sig_usr) == SIG_ERR)
                synchronismFlag = false;
        if(signal(SIGUSR2, sig_usr) == SIG_ERR)
                synchronismFlag = false;
        sigemptyset(&zeromask);
       
        sigemptyset(&newmask);
        sigaddset(&newmask, SIGUSR1);
        sigaddset(&newmask, SIGUSR2);
        if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
                synchronismFlag = false;
}

void TELL_PARENT(pid_t pid)
{
        kill(pid, SIGUSR2);
}

void WAIT_PARENT(void)
{
        while(sigflag == 0)
                sigsuspend(&zeromask);
        sigflag = 0;

        if(sigprocmask(SIG_SETMASK, &oldmask, 0) < 0)
                synchronismFlag = false;
}
void TELL_CHILD(pid_t pid)
{
        kill(pid, SIGUSR1);
}

void WAIT_CHILD(void)
{
        while(sigflag == 0)
                sigsuspend(&zeromask);
       
        sigflag = 0;
        if(sigprocmask(SIG_SETMASK, &oldmask, 0) < 0)
                synchronismFlag = false;
}

bool isSynchroAble(void)
{
        return synchronismFlag;
}

(你真是女孩吗?^_^)
回复

使用道具 举报

发表于 2004-12-14 23:46:55 | 显示全部楼层
最后一句是关键。不论男女,楼主交给楼上的去照顾吧!
回复

使用道具 举报

发表于 2004-12-17 13:02:47 | 显示全部楼层
我写了一个linux进程间信号机制通信的实验
希望实现的功能:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按ctrl+c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
Child process1 is killed by parent!
Child process2 is killed by parent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parent process is killed!

====================================
这个实验题已经有好几个问我了。我想知道你们是不是一个学校的??
哪个学校?
回复

使用道具 举报

发表于 2004-12-19 12:28:02 | 显示全部楼层
他们是北邮的,他们应该是计算机系的,哈哈,我现在也有人向我请教这个问题,他们总共有四部分,哈哈,
回复

使用道具 举报

发表于 2004-12-19 12:33:55 | 显示全部楼层
如果我说的不错的话,他们应该是邮大的,我现在连他们的四套题都有,呵呵





[quote:782f62438e="longwen"]我写了一个linux进程间信号机制通信的实验
希望实现的功能:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按ctrl+c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
Child process1 is killed by parent!
Child process2 is killed by parent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parent process is killed!

====================================
这个实验题已经有好几个问我了。我想知道你们是不是一个学校的??
哪个学校?[/quote]
回复

使用道具 举报

发表于 2004-12-19 14:18:29 | 显示全部楼层
这位小妹的账号似乎只是进来问问题的呦!
现在大学很流行linux么?
回复

使用道具 举报

 楼主| 发表于 2004-12-22 08:57:44 | 显示全部楼层
这个学期学玩操作系统了
老师以linux为蓝本
回复

使用道具 举报

 楼主| 发表于 2004-12-22 09:00:20 | 显示全部楼层
我是广外的 呵呵
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-6 21:32 , Processed in 0.077177 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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