QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 711|回复: 3

再次发帖,高手一定要帮我呀,这个题我真的不会,谁帮我`?真的

[复制链接]
发表于 2003-5-23 20:14:42 | 显示全部楼层 |阅读模式
编制一段程序,实现进程的软中断通讯:使用系统调用fork()创建两个子进程,再使用系统调用,signal() 让父进程捕捉键盘上来的中断信号(按del)捉到终端信号后,父进程用系统调用 kill()向两个子进程发信号:子进程捕捉到信号后分别输出下列信息后终止:
child process1 is killed by parent!
child process2 is killed by parent!
父进程等待两个进程都中止后,输出如下信息后终止:
parent process in killed!  
发表于 2003-5-23 21:51:24 | 显示全部楼层
这是在UNIX操作系统中的题目吧.以前做过的。
回复

使用道具 举报

发表于 2003-5-25 11:24:41 | 显示全部楼层
好好看看Unix环境高级编程吧
里面都有的
回复

使用道具 举报

发表于 2003-5-25 14:00:32 | 显示全部楼层
写了一个,还有些问题,主要是父进程没有处理其他信号,如果父进程收到其他信号结束子进程不会结束。
[code:1]
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>

static int create_child(void);
static void sig_int(int);
static void sig_usr(int);

static int child_no;
static pid_t child_pid[2];

int
main(void)
{
  if(create_child()){
    printf("cannot create child\n");
    exit(-1);
  }
  if(create_child()){
    printf("cannot create chld\n");
    kill(child_pid[0], SIGUSR1);
  }

  if(signal(SIGINT, sig_int) == SIG_ERR){
    perror("cannot catch SIGINT");
    exit(-1);
  }

  while(child_no > 0){
    wait(NULL);
    --child_no;
  }
  printf("parent process in killed\n");
  exit(0);
}

static int
create_child(void)
{
  pid_t pid;
  
  if((pid = fork()) < 0){
    perror("fork error");
    return(-1);
  }else if(pid == 0){
    ++child_no;
    if(signal(SIGUSR1, sig_usr) == SIG_ERR){
      perror("cannot catch SIGINT");
      return(-1);
    }
    signal(SIGINT, SIG_IGN);
    for(;;)
      pause();
  }
  
  child_pid[child_no] = pid;
  ++child_no;
  return(0);
}

static void
sig_int(int signo)
{
  kill(child_pid[0], SIGUSR1);
  kill(child_pid[1], SIGUSR1);
}

static void
sig_usr(int signo)
{
  printf("child process%d is killed by parent!\n", child_no);
  exit(0);
}
[/code:1]
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-15 19:29 , Processed in 0.102218 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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