进程间软中断通信(signal函数和kill函数)相关问题
关注:131 答案:2 mip版
解决时间 2021-02-05 19:50
提问者孤酒醉人心
2021-02-05 14:26
如下程序为什么不能得到预期的结果
#include #include #include 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);
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);
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;
}
最佳答案
二级知识专家再见不见
2021-02-05 15:39
两个问题:
1. while((p1=fork( ))= =-1);
写法有错误, 应该是 while((p1=fork( ))==-1); C里面 ==不能分开的。这里导致编译问题。
2. 改好上面的代码后,运行,你会发现Ctrl-c后,只会打印 Parent process is killed ,这是因为当你Ctrl-c的时候,系统会给父进程及其两个子进程都发送 SIGINT信号 (对bash来说,这三个进程都是前台进程,所以都发送), 对于父进程来说,收到这个信号自然是调用 stop函数了,但是对于两个子进程来说,默认的对这个信号的处理就是退出(exit),所以你看不到子进程的打印。解决方法有两种:
A: 不要用Ctrl-c的方法来发送SIGINT,而是用 kill 命令来向父进程单独发送 SIGINT,比如父进程pid是12345,那么就在终端下 kill -SIGINT 12345,你就可以看到你所预想看到的打印了。
B: 在两个子进程中,调用 signal(SIGINT, SIG_IGN); 来让子进程忽略SIGINT信号. (具体你可以放在你原来代码中 signal(16, stop)和signal(17, stop) 的后面),这样Ctrl-c后,也能看到你所想要的打印。
全部回答
1楼风是甜的
2021-02-05 16:38
虽然子进程将父进程的函数重新拷贝了一份,子进程和父进程共享同一段内存空间,但不能被共享。可以通过共享内存解决这个问题。使用这个函数void* mmap(void * addr, size_t len, int prot, int flags, int fd, off_t offset)把进程地址空间映射为共享内存。addr为被映射的进程地址空间内存地址,取null表示由系统决定;len为被映射地址空间的长度;prot为内存映射区保护参数,通常取为prot_read|prot_write;flags为标志,通常取为map_shared|map_anon;fd取为-1,offset取为0。成功返回被映射区的起始地址,失败返回错误码。需要的头文件为:sys/mman.h。
使用方法:int * share; //假设要把share所指向的一个整型变量映射为共享内存空间。
share = (int *)mmap(null, sizeof(int), prot_read|prot_write, map_shared|map_anon, -1, 0 )
这样就能实现你说的 了.
我要举报
如以上问答内容为低俗/色情/暴力/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!
→点此我要举报以上信息!←
推荐资讯
大家都在看