LINUX 进程间的软中断通信,进程间软中断通信(signal函数和kill函数)相关问题

进程间软中断通信(signal函数和kill函数)相关问题

关注:131  答案:2  mip版

解决时间 2021-02-05 19:50

e6cb1a03ad541b3098697807b7bf1798.png

提问者孤酒醉人心

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;

}

最佳答案

e6cb1a03ad541b3098697807b7bf1798.png

二级知识专家再见不见

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后,也能看到你所想要的打印。

全部回答

e6cb1a03ad541b3098697807b7bf1798.png

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 )

这样就能实现你说的 了.

我要举报

如以上问答内容为低俗/色情/暴力/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

→点此我要举报以上信息!←

推荐资讯

大家都在看

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值