当前位置: 技术问答>linux和unix
linux环境下父进程子进程异步问题
来源: 互联网 发布时间:2017-01-27
本文导语: 各位大侠,小弟学完操作系统,感觉学的也不差啊,但现在老师让做课程设计,题目是在Linux环境下编程,然后就焦虑了。之前学的时候也有看过一些linux内核方面的书,但看的云里雾里的,坚持了一段时间后由于其...
各位大侠,小弟学完操作系统,感觉学的也不差啊,但现在老师让做课程设计,题目是在Linux环境下编程,然后就焦虑了。之前学的时候也有看过一些linux内核方面的书,但看的云里雾里的,坚持了一段时间后由于其他课程太多,也就放了下来,结果现在就悲剧了,虽然借了好几本书狂翻资料,但还是感觉有点摸不到头绪,我觉的这东西,要是对linux内核机制有一定的了解的话还是很容易的,但现在关键是没有那么多时间让我去看,恐怕到时不能完成,所以请大家帮我指点指点该如何做,如果能给出相应的源程序当然更好!到时分一定送上;
下面是我的题目:
父进程和子进程通过信号实现异步合作
在Linux环境下用C语言编程实现,使用用户自定义的信号SIGUSR1由父进程发给子进程,SIGUSR2由子进程发给父进程;父进程和子进程各自从终端接收一个字符串,完成后用kill调用发送信号,接收方接收到信号后,显示对方的进程号及字符串。利用信号方式(Signal(SIGCHLD,SIG_IDN))使父进程不必等待子进程结束,且不产生"ZOMBIE".
拜托了!
下面是我的题目:
父进程和子进程通过信号实现异步合作
在Linux环境下用C语言编程实现,使用用户自定义的信号SIGUSR1由父进程发给子进程,SIGUSR2由子进程发给父进程;父进程和子进程各自从终端接收一个字符串,完成后用kill调用发送信号,接收方接收到信号后,显示对方的进程号及字符串。利用信号方式(Signal(SIGCHLD,SIG_IDN))使父进程不必等待子进程结束,且不产生"ZOMBIE".
拜托了!
|
#include
#include
#include
void p_action(int signo){
printf("parent process %d recieve SIGUSR2 signal,signo is %dn",getpid(),signo);
}
void c_action(int signo){
printf("child process %d recieve SIGUSR1 signal,signo is %dn",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,自然也应该是空串。
程序先进入 父进程的default ,遇到 sleep 阻塞后进入到 子进程的 case 0 同样sleep阻塞回到 父进程的default(我认为你这里的sleep没意义)。接下来 scanf IO 阻塞,但另一边也还阻塞着(就算sleep阻塞结束接下来又有一个scanf 的 IO 阻塞)
然后 现在你输入的 信息 会输入到 父进程的 ps 中。然后你给子进程发送了一个信号:kill(pid,SIGUSR1); 子进程收到信号后调用了 c_action 。不过 多进程的地址空间是独立的,子进程里的ps没有定义, 所以应该会输出 空串。同理 子进程的 cs 虽然你赋值了,但是 父进程执行 信号处理函数时,是调用自己地址空间里的cs,自然也应该是空串。