Linux父进程如何发信号给子进程,关于C#:fork和signal:如何将信号从父进程发送到特定的子进程...
我需要fork两个子进程。 一个可以接收信号3,打印hello并将信号4发送到另一个子进程; 另一个可以接收信号4,打印world并将信号3发送到第一个子进程。
首先,父进程将在睡眠3秒钟后将信号3发送到第一个子进程。
然后3秒后,父进程将发送SIGKILL杀死他们两个。
我不知道如何向特定的子进程发送信号(我知道我们有一个函数kill来发送信号,但是我不知道在这里使用它)。
这是我的代码:
#include
#include
#include
#include
#include
void func(int n)
{
printf("ping
");
// how to send signal 4 to the second process?
}
void func2(int n)
{
printf("pong
");
// how to send signal 3 to the first process?
}
int main()
{
pid_t pid;
int i;
for(i = 0; i < 2; i++)
{
pid = fork();
if(pid == 0)
{
if(i == 0)
{
signal(3, func);
}
else
{
signal(4, func2);
}
while(1);
}
else
{
if(i == 1)
{
sleep(3);
// how to send signal 3 to the first child process?
sleep(3);
// how to kill the two children?
}
}
}
return 0;
}
在信号上下文中调用printf()的未定义行为。
man7.org/linux/man-pages/man2/kill.2.html
@EOF那我该怎么办?
@alk但是我仍然不知道如何向子进程发送信号。
您需要kill()系统调用。 棘手的部分是,您必须以某种方式告诉每个孩子其兄弟姐妹的PID。 父母可能通过在管道上写信息来告诉他们两个吗? 或者,也许您使用过程组来进行信号发送。
@JonathanLeffler是的,实际上这是我不知道该怎么做。 也许您是对的,我必须使用管道或共享内存。
@ user3629249非常感谢。 如果您愿意,您可以回答这个问题,我会接受您的回答。
将我的评论移至答案。
您可以使用popen()函数通过分叉并打开该进程的管道来打开该进程(而不是直接使用fork())
父级知道每个进程的PID,因此可以轻松地将第二个孩子的pid传递给第一个孩子。
第一个孩子可以使用pid和kill()函数将信号传递给第二个孩子。
因此,使用popen()启动第一个孩子。使用fork()启动第二个孩子,然后通过popen()创建的流将pid从第二个孩子传递到第一个孩子。
从fork()调用返回的pid值的处理未正确处理。
发布的代码假设对fork()的调用已成功...这不是一个安全/有效的假设
该代码还需要检查pid是否为-1并适当地处理该错误。
当子进程完成时,它不应使用exit()函数位于while()循环中,而应退出。
父进程不应仅退出,因为这会使两个子进程成为僵尸。 (如果不重新启动系统,僵尸很难摆脱。)
相反,父级应该调用wait()甚至更好的waitpid()(并记住子进程需要实际退出,而不是坐在while()循环中。
1)func()和func2()应该检查参数以确保它是正在处理的正确信号。
2)signal()的手册页指示不应使用它。手册页建议使用:sigaction(),
fork时,您将获得新的pid。根据杀死手册,您使用pid调用kill(pid_t pid, int sig);
如果我在第一个sleep(3)之后写kill(pid, 3),我认为它将发送给所有子进程。 我需要发送到第一个子进程。
@托马斯:不; 除非您为pid使用零或负值,否则它将信号发送到一个进程。
好。 我知道了。 我还有另一个问题:如何在进程之间共享pid? 因为我需要func中的kill(4, secondProcessPid)和func2中的kill(3, firstProcessPid)。 如何获得这两个PID? 我必须使用共享内存之类的东西吗?
您有向后kill的参数。...在这种情况下,共享内存似乎是多余的。 当您fork()时,子进程是父进程的副本。 这包括全局变量和局部变量。
Linux父进程如何发信号给子进程,关于C#:fork和signal:如何将信号从父进程发送到特定的子进程...相关推荐
- Linux 3.进程间通信(shmget shmat shmdt shmctl 共享内存、signal signaction sigqueue 信号、semget semctl semop 信号量)
Linux 3.进程间通信(IPC) 共享内存 共享内存的接口指令 shmget 创建获取获取共享内存 shmat 映射:连接共享内存到当前进程的地址空间 shmdt 断开与共享内存的连接 shmct ...
- Linux 父进程 子进程 回收,回收 fork() 的子进程
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 使用 fork() 函数派生出多个子进程来并行执行程序的不同代码块,是一种常用的编程泛型.但是,在使用 fork() 函 ...
- Linux信号:SIGCHLD信号和僵尸进程
1. SIGCHLD信号产生条件: (1)子进程终止: (2)子进程收到SIGSTOP信号被暂停: (3)子进程处于暂停状态,收到SIGCONT信号被唤醒. 2. 捕捉SIGCHLD,避免僵尸进程: ...
- 【Linux进程、线程、任务调度】二 fork/vfork与写时拷贝 线程的本质 托孤 进程睡眠和等待队列
学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...
- 【Linux】SIGCHLD信号解决僵尸进程问题
1. 基本信息 SIGCHLD信号产生的条件: 子进程终止时 子进程接收到SIGSTOP信号停止时 子进程处在停止态,接受到SIGCONT后唤醒时 以上三种条件都会给父进程发送SIGCHLD信号,父进 ...
- 【Linux 内核】进程管理 ( 进程状态 | 进程创建 | 进程终止 | 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 )
文章目录 一.进程状态 二.进程创建 三.进程终止 ( 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 ) 一.进程状态 Linux 进 ...
- linux 信号 sigaction(是signal的扩展,在多线程应用中替代了signal)(除了信号值信息外,还可以附加数值信息(以及指针:不可跨进程):sigqueue()函数)
参考视频教程:https://www.bilibili.com/video/BV145411a76x?p=6 另外:Linux多线程详解(线程的实现.线程回收.线程取消.线程清理,线程信号.线程调试, ...
- linux关闭wps画布进程,在Deepin系统下安装WPS后一直出现一个无响应的wpsoffice进程...
很多人在Deepin 20 Linux系统下安装WPS新版本后都出现一个无响应的wpsoffice进程,不过似乎不是共有的问题,有些人表示没有这个. 进一步说明 如果把WPS给卸载掉然后再重新安装,还 ...
- Linux学习笔记22——sigsuspend 让指定的信号无法唤醒进程
1,由来 让指定的信号无法唤醒进程貌似很简单,只要先设置屏蔽字屏蔽指定的信号,再pause就可以了.以后只要接收到信号,切该信号不是指定的信号就可以结束 pause.但是,这种做法是分两步做的,而信号 ...
- Linux 应用程序 嵌汇编,Linux下嵌入汇编代码调用API(using fork())
以下关于fork()的描述来自于:jason314 首先,在Linux环境下,一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新 ...
最新文章
- Linux下MySQL数据库主从同步配置
- unigui 导入导出数据
- chrome解决跨域(CORS)问题---chrome插件
- 懒人修仙传ce修改方法_盘点《西游记》中增长寿命的6种方法,其中长生不老的方法有三种...
- [导入]Silverlight 的 Data Bindings:Silverlight 與 ASP.NET Ajax
- How to research,22页PPT
- BZOJ 2839: 集合计数 解题报告
- Flutter尝鲜:跨平台移动应用开发
- Ubuntu18.04运行QQ音乐
- win10 休眠不读u盘_win10电脑不读u盘如何修复
- vue使用pdf.js预览pdf文件加水印,下载pdf文件
- 淘宝最基础的优化:标题优化
- 程序员的数学思维修炼(趣味解读)还有哪些进制
- Python 玫瑰花绘制
- [xml]DOM4j解析
- 51单片机小知识总结
- 手动安装couchdb并且指定版本 详细教程
- HDFS磁盘满了扩容
- 2018 年最受欢迎的美国公司 Top 50,亚马逊卫冕!
- [乐意黎翻译]JavaScript命令之Console大全
热门文章
- 秋色园QBlog技术原理解析:Module之页面基类设计(五)
- Delphi 集合和字符串互转
- poj 3267 -- The Cow Lexicon
- spring Quartz基于配置文件和注解的实现
- “做人难,人难做,难做人,做男人更难啊!
- JavaScript动态显示当前时间和倒计时的设计(附全码)_AX
- eclipse新建java项目_用eclipse创建Java项目(以一个初学者的角度全面教学)
- 楼层平面放线及标高实测记录_建筑平面图怎么看?教你这样看图,新手也能秒懂...
- matlab差分方程实验报告,实验二微分方程与差分方程模型matlab求解.doc
- 解决Chrome插件安装时出现的 “CRX_HEADER_INVALID” (程序包无效) 问题