我需要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:如何将信号从父进程发送到特定的子进程...相关推荐

  1. Linux 3.进程间通信(shmget shmat shmdt shmctl 共享内存、signal signaction sigqueue 信号、semget semctl semop 信号量)

    Linux 3.进程间通信(IPC) 共享内存 共享内存的接口指令 shmget 创建获取获取共享内存 shmat 映射:连接共享内存到当前进程的地址空间 shmdt 断开与共享内存的连接 shmct ...

  2. Linux 父进程 子进程 回收,回收 fork() 的子进程

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 使用 fork() 函数派生出多个子进程来并行执行程序的不同代码块,是一种常用的编程泛型.但是,在使用 fork() 函 ...

  3. Linux信号:SIGCHLD信号和僵尸进程

    1. SIGCHLD信号产生条件: (1)子进程终止: (2)子进程收到SIGSTOP信号被暂停: (3)子进程处于暂停状态,收到SIGCONT信号被唤醒. 2. 捕捉SIGCHLD,避免僵尸进程: ...

  4. 【Linux进程、线程、任务调度】二 fork/vfork与写时拷贝 线程的本质 托孤 进程睡眠和等待队列

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...

  5. 【Linux】SIGCHLD信号解决僵尸进程问题

    1. 基本信息 SIGCHLD信号产生的条件: 子进程终止时 子进程接收到SIGSTOP信号停止时 子进程处在停止态,接受到SIGCONT后唤醒时 以上三种条件都会给父进程发送SIGCHLD信号,父进 ...

  6. 【Linux 内核】进程管理 ( 进程状态 | 进程创建 | 进程终止 | 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 )

    文章目录 一.进程状态 二.进程创建 三.进程终止 ( 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 ) 一.进程状态 Linux 进 ...

  7. linux 信号 sigaction(是signal的扩展,在多线程应用中替代了signal)(除了信号值信息外,还可以附加数值信息(以及指针:不可跨进程):sigqueue()函数)

    参考视频教程:https://www.bilibili.com/video/BV145411a76x?p=6 另外:Linux多线程详解(线程的实现.线程回收.线程取消.线程清理,线程信号.线程调试, ...

  8. linux关闭wps画布进程,在Deepin系统下安装WPS后一直出现一个无响应的wpsoffice进程...

    很多人在Deepin 20 Linux系统下安装WPS新版本后都出现一个无响应的wpsoffice进程,不过似乎不是共有的问题,有些人表示没有这个. 进一步说明 如果把WPS给卸载掉然后再重新安装,还 ...

  9. Linux学习笔记22——sigsuspend 让指定的信号无法唤醒进程

    1,由来 让指定的信号无法唤醒进程貌似很简单,只要先设置屏蔽字屏蔽指定的信号,再pause就可以了.以后只要接收到信号,切该信号不是指定的信号就可以结束 pause.但是,这种做法是分两步做的,而信号 ...

  10. Linux 应用程序 嵌汇编,Linux下嵌入汇编代码调用API(using fork())

    以下关于fork()的描述来自于:jason314 首先,在Linux环境下,一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新 ...

最新文章

  1. Linux下MySQL数据库主从同步配置
  2. unigui 导入导出数据
  3. chrome解决跨域(CORS)问题---chrome插件
  4. 懒人修仙传ce修改方法_盘点《西游记》中增长寿命的6种方法,其中长生不老的方法有三种...
  5. [导入]Silverlight 的 Data Bindings:Silverlight 與 ASP.NET Ajax
  6. How to research,22页PPT
  7. BZOJ 2839: 集合计数 解题报告
  8. Flutter尝鲜:跨平台移动应用开发
  9. Ubuntu18.04运行QQ音乐
  10. win10 休眠不读u盘_win10电脑不读u盘如何修复
  11. vue使用pdf.js预览pdf文件加水印,下载pdf文件
  12. 淘宝最基础的优化:标题优化
  13. 程序员的数学思维修炼(趣味解读)还有哪些进制
  14. Python 玫瑰花绘制
  15. [xml]DOM4j解析
  16. 51单片机小知识总结
  17. 手动安装couchdb并且指定版本 详细教程
  18. HDFS磁盘满了扩容
  19. 2018 年最受欢迎的美国公司 Top 50,亚马逊卫冕!
  20. [乐意黎翻译]JavaScript命令之Console大全

热门文章

  1. 秋色园QBlog技术原理解析:Module之页面基类设计(五)
  2. Delphi 集合和字符串互转
  3. poj 3267 -- The Cow Lexicon
  4. spring Quartz基于配置文件和注解的实现
  5. “做人难,人难做,难做人,做男人更难啊!
  6. JavaScript动态显示当前时间和倒计时的设计(附全码)_AX
  7. eclipse新建java项目_用eclipse创建Java项目(以一个初学者的角度全面教学)
  8. 楼层平面放线及标高实测记录_建筑平面图怎么看?教你这样看图,新手也能秒懂...
  9. matlab差分方程实验报告,实验二微分方程与差分方程模型matlab求解.doc
  10. 解决Chrome插件安装时出现的 “CRX_HEADER_INVALID” (程序包无效) 问题