- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我参与了使用 fork 的练习的解决。语句是这样的:1 个父级创建 3 个子级,它们具有随机且不同的执行时间,并且必须将各自的值返回给父级。所以,到目前为止,我能够创建和执行子进程并捕获它们的一些值,但此后执行变得疯狂。到目前为止我得到的代码是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#define MAXCAPOS 3
#define MAXCOMERCIOS 3
/* Funcion que calcula aleatorios */
int calculaAleatorios(int min, int max) {
return rand() % (max-min+1) + min;
}
/* Funcion para dar más tiempo a que los negocios paguen */
void darPlazo() {
printf("\nDON: ¡Chicos! Decidle a los comerciantes que me deben dinero, que como no paguen lo que me deben, la semana que viene quemare sus tiendas.");
}
/* Funcion para dar una leccion a los negocios */
void darLeccion() {
printf("\nDON: ¡Chicos! Quemad los comercios que no han pagado esta semana.");
}
/* Funcion para generar un consejo */
void generaConsejo() {
sleep(10);
if(calculaAleatorios(0,1)==0) {
printf("\nConsigliere: Ya he deliberado SIGUSR1");
kill(getppid(), SIGUSR1);
} else {
printf("\nConsigliere: Ya he deliberado SIGUSR2");
kill(getppid(), SIGUSR2);
}
}
int main(void){
pid_t pidDon;
pid_t pidCapo[MAXCAPOS];
pid_t pidConsigliere;
int i = 1, j = 1;
int totalImpagos = 0;
for (i; i <= MAXCAPOS; i++){
/* Forkeando pidDon para obtener los capos */
switch (pidDon = fork()){
case -1:
perror("Error en la llamada a la funcion fork()");
exit(EXIT_FAILURE);
break;
case 0:
{
int noPagan = 0, tiempo = 0;
pidCapo[i] = getpid();
srand(pidCapo[i]); /*Generamos una semilla por el pid, dentro del proceso hijo para obtener semillas diferentes*/
printf("\nDON: Contrato al capo%d (pid: %d)", i, pidCapo[i]);
/* VISITAR LOS COMERCIOS Y RECIBIR CUANTOS HAN PAGADO (int) */
for (j; j <= MAXCOMERCIOS; j++){
tiempo = calculaAleatorios(5, 10); /* Genera un tiempo aleatorio entre 5 y 10 */
printf("\n Capo%d: %d Segundos para despertar (pid: %d)", i, tiempo, pidCapo[i]);
sleep(tiempo);
printf("\n Capo%d: Visita el comercio %d (pid: %d)", i, j, pidCapo[i]);
if (calculaAleatorios(0, 1) == 0){
printf("\n Capo%d: El comercio %d no me ha pagado, malditas ratas!! (pid: %d)", i, j, pidCapo[i]);
noPagan++;
} else {
printf("\n Capo%d: El comercio %d ha pagado (pid:%d)", i, j, pidCapo[i]);
}
}
printf("\nCapo%d: tengo %d morosos", i, noPagan);
exit(noPagan);
break;
}
default:
break;
}
}
/*Proceso DON*/
// Crear señales
printf("\nDON: Voy a esperar noticias de mis capos... (pid: %d)", getpid());
signal(SIGUSR1, darPlazo); // Unimos la señal SIGUSR1 a su procedimiento
signal(SIGUSR2, darLeccion); //Unimos la señal SIGUSR2 a su procedimiento
if (pidDon != 0 && pidDon != -1){
for (i = 1; i <= MAXCAPOS; i++){
int retorno;
waitpid(pidCapo[i], &retorno, 0);
retorno = WEXITSTATUS(retorno);
printf("\nDON: Al capo %d no le han pagado %d comercios", i, retorno);
totalImpagos += retorno;
}
sleep(30);
if (totalImpagos == 0){
printf("\nDON: Que bien, esta vez han pagado todos :D");
printf("\nDON: He terminado mi dia\n");
return (0);
} else {
if (totalImpagos == 1){
printf("\nDON: No me ha pagado 1 comercio, grrrrrrrr!!!!");
}
if (totalImpagos > 1){
printf("\nDON: No me han pagado %d comercios, estoy muy encabronado!", totalImpagos);
}
printf("\nDON: Consultare con mi consigliere");
/*Proceso Consigliere*/
pidConsigliere = fork();
if (pidConsigliere == -1){
perror("\nFallo al crear el proceso Consigliere");
exit(EXIT_FAILURE);
}
else if (pidConsigliere == 0){
signal(SIGUSR1, generaConsejo); // Unimos la señal SIGUSR1 a su procedimiento
printf("\nConsigliere: Hola Don! Espero tu señal");
pause();
exit(0);
}
/*Vuelta al DON*/
// Consulta al consigliere
sleep(5);
printf("\DON: Le mando una señal a mi consigliere");
if (kill(pidConsigliere, SIGUSR1) == -1){ // Lanzamos kill contra pidConsigliere y evaluamos el error
perror("\nFallo al enviar la señal al Consigliere");
exit(EXIT_FAILURE);
}
printf("\nDON: Esperare mientras mi consigliere delibera");
pause();
}
}
printf("\nDON: He terminado mi dia\n");
return (0);
}
所以,我需要知道如何正确检索所有 3 个返回值。提前致谢。
最佳答案
如何在父级中安装 SIGCHLD
信号处理程序,并在调用它时,使用 wait()
、waitpid() 获取子级的退出状态
或wait4()
?
这是规范的做法。我不太确定 SIGUSR1/2
的目的是什么。
关于c - 异步将值返回给父进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34354638/
我目前正在寻找一些关于 jQuery 的建议,因为我认为我做错了,即使我得到了我想要的结果。 我想在更改时将输入的值更改为最接近的具有 .milestone 类的输入的值。我想要更改的输入是保持输入,
我已经阅读有关绑定(bind)、调用、申请的文章近一周了,对我来说仍然很复杂。我想我写的这个 jsfiddle 需要它们。然而,我没能做到,因为我仍然很困惑。 我尽力写了一些我上周从遇到这个问题的开发
我有一个项目生成代码。生成时间真的很长,所以我把它分成了多个项目,每个项目产生了整体的 20%。原始 POM 成为“父 POM”,子项依赖于它,仅包含一个单独的 Artifact ID 和一两个更改的
我正在使用局部 View 来创建父 subview 。我最理想的是父 View 上的提交按钮,用于保存子值。 我有以下模型。 public class Course { public int
我刚刚开始学习Rust,并且在理解所有权如何在我的案例中遇到一些麻烦: use std::ops::IndexMut; // =====================================
我是 JavaScript 新手,想了解更多有关它实例化父/子对象的顺序的信息。更具体地说,我想从编译器/浏览器的 Angular 理解以下代码片段。 var parent = { child:
我正在测试 Azure IaaS,并遇到了一个非常基本的问题。我有一个父 VHD 和子 VHD,已使用 csupload 将其作为页面 blob 上传,并且门户中显示图像和磁盘。然后我尝试将 pare
我的应用程序会定期为我坚持使用的对象请求更新 Core Data到网络服务。然后我需要更新我在主要上下文中拥有的对象(默认情况下 AppDelegate 中提供的对象)。编辑对象的不是用户,所以我需要
texT text text text text text 如何直接获取来自.menu ? 里面的 child 不应该采取。
我一直需要影响与其他元素相关的元素,但我的方法有点业余! 即到 // matched item where script is called from LINK 我使用; $(thi
我有两个表: 父子“类别”: id name parent_id 1 Food NULL 2 Pizza 1 3 Pasta
Linux 上的 Python 2.7.6。 我正在使用从父级继承的测试类。父类保存了许多子类共有的许多字段,我需要调用父类的 setUp 方法来初始化这些字段。调用 ParentClass.setU
我有一个处理图像、相册和相册类别的数据库。 一个专辑可以有多个专辑(子专辑),并且只有 1 级深度。 一张专辑仅属于一个专辑类别。 在这里做了一些研究,我相信最合适的数据库模型是这个 album_ca
我有一个关键字表,其中每个关键字都分配有一个 ID,并且是唯一的。我有第二个表,将父关键字的 ID 链接到子关键字的 ID。一个关键字最多可以有大约 800 个 child 或根本没有。 child
我经常使用这个 CSS 选择器 parent>child。我的设计在 Mozilla 和 Opera 中看起来不错。 但在 IE 中,它很糟糕。我知道 > 在 IE 中无法识别,但在 IE 中有什么替
我一直在用一个父对象构建一个系统,它在其中创建各种子对象,每个子对象都需要一个主对象才能运行。现在,到目前为止,我一直在创建 shared_ptr和 Child* ,所以当 Parent 和 所有 C
我从以下两个类中收到序列化兼容性错误。只有父类CommericalCustomer 实现了序列化。当具有如下所示的父/子关系时,使用可序列化接口(interface)的正确方法是什么? public
我正在开发一个程序并学习父/子进程。目前我的子进程是 exit(variable); 在我的 main() 中我有: signal(SIGCHLD, chldHandler); 在我的 main()
考虑以下两个具体类: public class A { protected void foo() { System.out.println("A foo"); bar
所以,我正在尝试建立这样的父/子类关系: class ParentClass where C : ChildClass { public void AddChild(C child)
我是一名优秀的程序员,十分优秀!