日期:2014-05-16  浏览次数:20617 次

linux环境下父进程子进程异步问题
各位大侠,小弟学完操作系统,感觉学的也不差啊,但现在老师让做课程设计,题目是在Linux环境下编程,然后就焦虑了。之前学的时候也有看过一些linux内核方面的书,但看的云里雾里的,坚持了一段时间后由于其他课程太多,也就放了下来,结果现在就悲剧了,虽然借了好几本书狂翻资料,但还是感觉有点摸不到头绪,我觉的这东西,要是对linux内核机制有一定的了解的话还是很容易的,但现在关键是没有那么多时间让我去看,恐怕到时不能完成,所以请大家帮我指点指点该如何做,如果能给出相应的源程序当然更好!到时分一定送上;
  下面是我的题目:
  父进程和子进程通过信号实现异步合作
  在Linux环境下用C语言编程实现,使用用户自定义的信号SIGUSR1由父进程发给子进程,SIGUSR2由子进程发给父进程;父进程和子进程各自从终端接收一个字符串,完成后用kill调用发送信号,接收方接收到信号后,显示对方的进程号及字符串。利用信号方式(Signal(SIGCHLD,SIG_IDN))使父进程不必等待子进程结束,且不产生"ZOMBIE".
  拜托了!
------解决方案--------------------

#include <stdio.h>
#include <unistd.h>
#include <signal.h>


void p_action(int signo){
    printf("parent process %d recieve SIGUSR2 signal,signo is %d\n",getpid(),signo);
}

void c_action(int signo){
    printf("child process %d recieve SIGUSR1 signal,signo is %d\n",getpid(),signo);
}

int main(int argc, char *argv[])
{
    int pid,ppid;
    signal(SIGCHLD,SIG_IGN);
    switch(pid=fork()){
        case -1:
            printf("create child process error!\n");
            break;
        case 0:
            signal(SIGUSR1,c_action);
            ppid=getppid();
            sleep(5);
            printf("child process %d send signal %d to process %d...\n",getpid(),SIGUSR2,ppid);
            kill(ppid,SIGUSR2);
            break;
        default:
            signal(SIGUSR2,p_action);
            sleep(2);
            printf("parent process %d send signal %d to process %d...\n",getpid(),SIGUSR1,pid);
            kill(pid,SIGUSR1);
            pause();
            break;
    }
    return 0;
}

------解决方案--------------------
fork()得到一个子进程。
程序先进入 父进程的default ,遇到 sleep 阻塞后进入到 子进程的 case 0 同样sleep阻塞回到 父进程的default(我认为你这里的sleep没意义)。接下来 scanf IO 阻塞,但另一边也还阻塞着(就算sleep阻塞结束接下来又有一个scanf 的 IO 阻塞)
然后 现在你输入的 信息 会输入到 父进程的 ps 中。然后你给子进程发送了一个信号:kill(pid,SIGUSR1); 子进程收到信号后调用了 c_action 。不过 多进程的地址空间是独立的,子进程里的ps没有定义, 所以应该会输出 空串。同理 子进程的 cs 虽然你赋值了,但是 父进程执行 信号处理函数时,是调用自己地址空间里的cs,自然也应该是空串。