C 使用信号同步进程

2024-01-04

好吧,我正在尝试自学如何发送信号,但我遇到了一个小问题,我不知道我做错了什么。现在发生的事情是:它正在执行父级,然后转到子级,然后返回父级。它没有执行我希望它执行的操作,即执行父级(用户定义其运行的时间量)然后杀死它然后转到子进程并在相同的时间内运行它自己。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h> // for wait
#include <sys/wait.h>  // for wait

void action(int);
void action(int dummy){
    sleep(1);
    printf("Switching\n");
}

int main(int argc, char *argv[]){
    pid_t pid;
    int m = atoi(argv[1]), i = 0, x = 0;
    if((pid=fork())>0){//parent
        sleep(1);
        while(i < m){
            printf("hello %d\n", x);
            x++;
            kill(pid, SIGUSR1);
            signal(SIGUSR1, action);
            pause();
            i++;
        }
    }

    else
        while(i < m){//child
            //waitpid(getppid(), &status, 0); // wait for parent
            signal(SIGUSR1, action);
            pause();
            printf("hi%d\n", x);
            x++;
            kill(getppid(), SIGUSR1);
            i++;
        }
}

我想要它做的是:

hello 0
hello 1
hello 2
hello 3
hello 4
Switching
hi 0
hi 1
hi 2
hi 3
hi 4

任何帮助深表感谢!


您已经获得了大部分内容,只需要稍微重新排序即可。

  • 使用前在两个进程中安装信号处理程序kill
  • 家长应在向孩子发出信号之前完成打印
  • 孩子可以在打印完成后回复信号

void action(int dummy)
{
    sleep(1);
    printf("Switching\n");
}

int main(int argc, char *argv[])
{
    int m = 3;
    if (argc == 2)
        m = atoi(argv[1]);

    pid_t pid = fork();         // create the child process
    signal(SIGUSR1, action);    // set up the signal handler for both parent and child

    if ( pid > 0 )              // the parent
    {
        for ( int i = 0; i < m; i++ )
        {
            sleep(1);
            printf("hello %d\n", i);
        }
        kill( pid, SIGUSR1 );   // signal the child
        pause();                // wait for the child to signal back
        printf("All done\n");
    }
    else                        // the child
    {
        pause();                // wait for the signal from the parent
        for ( int i = 0; i < m; i++ )
        {
            sleep(1);
            printf("hi %d\n", i);
        }
        kill(getppid(), SIGUSR1);   // signal the parent
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 使用信号同步进程 的相关文章

  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐

  • Laravel 投票系统

    我正在我的 laravel school 项目中实现一个投票系统 它将是一个在线学校平台 学生可以上传项目 其他学生可以对发布的内容进行投票 不知何故 我所做的不起作用 这是到目前为止我的代码 希望有人可以帮助我 也许可以帮助我如何显示项目
  • javascript setAttribute("name",newname) 不会更改它创建的文本框的名称

    我使用这个函数在表中创建一个新行 function addRow obj var table document getElementById table2 var rowCount table rows length 1 var row t
  • CSS:删除较大文本上的行高(前导)

    如何从强制范围中删除前导 以便 lt lt 上方和下方没有额外的空间 字段行在默认的基础上占据一定的高度line height然而 对于文本大小 必填字段更高 因为字体更大 如何去掉上方和下方多余的空白 lt
  • Prometheus中将两个不同的指标分组后如何划分?

    我目前正在尝试对可用区内的 Kubernetes Pod 堆叠发出警报 我成功地使用了两种不同的指标 可以看到应用程序有多少个 pod 正在特定的可用区域上运行 但是 由于扩展 我希望警报基于百分比 因此 当某个可用区上运行特定百分比的 P
  • 通过 BeeTee 应用程序连接到其他蓝牙设备

    我需要实现一个自建蓝牙应用程序来将所有蓝牙设备连接到 iPhone 我知道 CoreBluetooth 框架不可能做到这一点 我使用私有API并将DeviceManager和BluetoothManager的头文件添加到私有框架中 并从下载
  • 在 Dockerfile 中覆盖 FROM 镜像的 ENV

    从下图可以看出 https registry hub docker com u cloudesire activemq dockerfile https registry hub docker com u cloudesire active
  • 获取 OpenGL 最大纹理尺寸

    我正在开发一个 Android 应用程序 它将广泛使用位图 并且我正在寻找一种可靠的方法来获取不同设备上 OpenGL 的最大纹理大小 我知道最小尺寸 2048x2048 但这还不够好 因为已经有分辨率更高的平板电脑 例如 2560x160
  • 如果结构具有 ReadOnlySpan 字段,如何将 ref 结构参数传递给 MethodInfo

    我有一个MethodInfo代表一个方法的对象 该方法采用ref struct作为参数 并且该结构有一个ReadOnlySpan
  • 使用 GoLang Web 服务器提供静态内容

    我正在探索 Go 的深度 并且一直在尝试编写一个简单的 Web 应用程序来理解所有内容 我正在尝试提供 React js 应用程序 下面是Go服务器的代码 我有默认路线 服务于index html工作正常 我正在努力允许将静态文件提供给该索
  • Python - 访问列表中嵌套字典中的值

    我有一个 JSON API 响应 如下所示 json data sales list date all country all units product promotions 0 downloads 1 updates 2 refunds
  • “错误:无法生成视图绑定器 java.lang.NullPointerException”的可能原因

    我正在使用 Android Studio 来处理我的 Android 项目 当构建因奇怪的堆栈跟踪而崩溃时 我遇到了一个问题 如下所示 Error Execution failed for task app compileDevDebugJ
  • DrRacket、R5RS和错误程序

    我喜欢 DrRacket IDE 但目前我正在构建一个我希望独立于它的宠物项目 这意味着我致力于仅使用 R5RS 标准程序 问题是 在 DrRacket 中有一个名为 错误 的过程 我想继续使用它 但我在标准中找不到它 我想知道是否有一种方
  • publishHtml reportFiles 参数语法是什么

    我正在尝试通过 Jenkinsfile 为 Jenkins 配置 HTML Publisher 插件来发布一些 html 文件 如下所示 publishHTML target allowMissing false alwaysLinkToL
  • 如何在 R 中创建条件虚拟对象?

    我有一个时间序列数据的数据框 其中包含每日温度观测值 我需要创建一个虚拟变量 对温度高于阈值 5C 的每一天进行计数 这本身很容易 但存在一个附加条件 仅在连续十天高于阈值后才开始计数 这是一个示例数据框 df lt data frame
  • 如何在酶中等待私人功能的承诺?

    我是 React 和任何 JavaScript 测试框架的新手 我有一个简单的组件 可以从 API 检索项目并将其显示在屏幕上 函数 getItems 是从 componentWillMount 调用的 是否可以等到 getItems 完成
  • Bitfinex 数据 API

    我正在尝试使用 bitfinex REST api 获取历史 OHLC 数据 文档如下 https bitfinex readme io v2 reference rest public candles https bitfinex rea
  • 如何在 C++ 中比较两个位图屏幕截图的字节到字节

    在问题的最后我的最后编辑 大家好 我必须实现一个功能来比较屏幕一部分的两个镜头 以便知道是否存在差异 变化 我写了类似下面的代码 但我无法让它工作 在代码中 COORDINATES RECT 是一个结构体 typedef struct CO
  • 当 Windows 进入睡眠模式然后唤醒时 setTimeout 不起作用

    我在 Chrome 中注意到了这一点 有人知道出了什么问题或解决方法吗 您可以使用setInterval相反 它继续运行 如果您需要一次性解决方案 请使用clearInterval删除计时器 setInterval如果计算机处于睡眠状态 而
  • 在视图模式中打开会话

    鉴于我选择的 JPA Hibernate 实现 Spring 和 开发框架 我问这个问题 我一直在思考实体层中的关系 例如 我有一个包含许多订单行的订单实体 我已经设置了我的应用程序 以便它急切地加载每个订单的订单行 您是否认为这是一种解决
  • C 使用信号同步进程

    好吧 我正在尝试自学如何发送信号 但我遇到了一个小问题 我不知道我做错了什么 现在发生的事情是 它正在执行父级 然后转到子级 然后返回父级 它没有执行我希望它执行的操作 即执行父级 用户定义其运行的时间量 然后杀死它然后转到子进程并在相同的