- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为一个类(class)编写一个玩具外壳程序,我在我的 mac (Darwin 13.4.0) 上完成了所有编码并使用 gcc <programname> -o <executablename>
进行了编译。 .一切似乎都运行完美。然后我将源代码通过 ftp 传输到学校的 Linux 服务器并再次编译,使用完全相同的编译指令,但在 Linux 机器上代码有错误。特别是,sigaction(信号处理程序)似乎并不总是正常工作。似乎它没有可靠地捕获 SIGCHLD 信号。 编辑——实际上,我存储状态的变量被破坏了,所以前台进程显示的状态不正确。
有人知道为什么操作系统的更改会导致此类问题吗?
这是我的信号处理程序代码:
void handleSignal(int signal){
int childid = 0;
int tempStatus = 0;
while ( (childid = waitpid(-1, &childStatus, WNOHANG)) > 0) {
/*Parse the exit status */
if(WIFEXITED(childStatus)){
childStatus = WEXITSTATUS(childStatus);
}
switch (signal) {
/*if the signal came from a child */
case SIGCHLD:
/*for background processes alert user */
if (childid != foregroundProcess){
printf("pid %i terminated:",childid);
showStatus(childStatus);
fflush(stdout);
}
/* for foreground children ending, just set the temp Status, in case*/
/* background children also need to be caught */
else {
tempStatus = childStatus;
}
break;
case SIGINT:
/*If there is a foreground child, send signal to it, else ignore. */
if (foregroundProcess){
kill(foregroundProcess, signal);
}
break;
default:
printf("Some other signal was received: code %i\n", signal);
fflush(stdout);
}
}
childStatus = tempStatus; /* reset child status to foreground status */
}
编辑:添加注册信号处理程序的代码:
struct sigaction sa;
sa.sa_handler = &handleSignal; /*passing function ref. to handler */
sa.sa_flags = SA_RESTART; /* restart the shell signal handler */
sigfillset(&sa.sa_mask); /*block all other signals while handling sigs */
sigaction(SIGINT, &sa, NULL);
sigaction(SIGCHLD, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
最佳答案
无视。解决了。这就是问题所在:我在主程序循环中等待前台子进程,我也在信号处理程序中等待它。在主循环中,我使用了 waitoptions = 0,因此程序会等待,并且在处理程序 WNOHANG 中。
那么为什么它在 Linux 和 Darwin 中的表现不同呢?这是我的理论:在 Darwin 盒子上,当 child 死亡时,SIGCHLD 信号在父循环中的 waitpid 发现 child 已经死亡之前被传递和处理。所以信号处理程序处理了垂死的前景 child 。然后,当执行返回到主循环中的 waitpid 命令时,不存在具有该 pid 的子进程,waitpid 函数返回错误 -1。但是,我没有检查 waitpid 调用的返回值,这意味着错误对我来说是无声的,程序在 Darwin 机器上运行正常。
然而,在 Linux 机器中,主程序循环中的 waitpid 在信号处理程序之前先执行。因此 childstatus 将在主程序循环中设置(正确)。然后,当信号处理程序捕获 SIGCHLD 信号时,进程已经等待。所以 waitpid 返回错误 (-1, errno 10)。但是由于我在信号处理程序中处理子状态变量的方式(使用 childStatus 和 tempStatus),这种情况会破坏我的子状态,将其重置回 0。因此,在 Linux 上运行时,每个前景子状态都显示为 0 的退出状态机,但在 Mac 上有适当的退出状态。解决方案?将 tempStatus 声明更改为 int tempStatus = childStatus
。这样,如果 childStatus 已被前台进程设置,则跳过整个循环并保持状态。但是,如果代表后台进程调用信号处理程序,则信号处理程序会保存前台状态(如果存在),并在处理后台时显示后台状态,然后重置前台状态。
丑陋...但它足以在几个小时内达到一个等级。
我不知道这是否会对其他人有所帮助,但是嘿,它可能会。谈论令人沮丧!
关于C 代码适用于 Mac (Darwin 13.4),但不适用于 Linux (2.6.32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33879376/
突然出现这个奇怪的错误。不确定 Xcode 是否已损坏。任何人都知道如何在 Xcode 中修复此错误。 代码是干净的,确保它在其他机器上工作正常,Xcode 设置或某些配置存在一些问题。 'time.
自从在 Xcode 9(以前的 8.2)中打开我的项目以来,几个静态库和框架目标无法编译并出现大量错误。这个循环依赖错误总是在顶部。 一个例子是 libzip 的静态库目标。问题源于系统 zlib 库
问题概述 我正在尝试学习如何构建交叉编译器,特别是在面向 i386-apple- 的 64 位 Intel OS X 主机上构建 GNU gcc 4.7.2 版本darwin(32 位英特尔)。但是,
我刚刚将我的 OS X 从 10.10.5 升级到了 OS X El Capitan 10.11。 我试图将我的 mac 端口更新到版本 2.3.3 ... Mac 端口收到此错误: $ sudo p
这段代码在快速访问 C 中的时间和日期函数时有什么问题?即使 difftime 函数在时差上是正确的,它给我的日期也有 3 天的偏差。 import Darwin var time1 = t
FOREWORD: This question is in regards to essential manpages that have seemingly disappeared from the
我正在尝试了解如何在 Mac 上重新映射内存映射文件(当我想扩展可用空间时)。 我看到我们在 Linux 世界的 friend 有 mremap 但我在我的 Mac 上的标题中找不到这样的功能。 /D
我是 nix 世界的新手,我使用 Mac OS X。我刚刚在我的 MacBook 上安装了 nix,并想使用 nix 来管理一些软件包,例如 Emacs 而不是 Homebrew。 我找到了这个仓库:
我需要测量 darwin 上各个线程的 cpu 使用率。在 linux 上我使用 getrusage(RUSAGE_THREAD, ...) 但它在 darwin 上不可用。 最佳答案 getrusa
我有一个用 C++ 编写的服务器,它在 osx 上运行时会泄漏 Mach 端口。具体来说,运行时 top我注意到它有大约 50000(在 #PORTS 下)。奇怪的是,我让它运行了一夜,第二天机器基本
当我尝试 swift package generate-xcodeproj 我得到 - :0: error: cannot load underlying module for 'Darwin' Ca
应用程序配置为在后台接收位置更新,以保持应用程序处于事件状态,并且当应用程序在后台时成功接收更新。 Darwin 通知也已配置,仅当该应用程序是前台的当前应用程序时才会收到通知。一旦应用程序进入后台,
在 Linux 上,sched.h 包含的定义 int sched_rr_get_interval(pid_t pid, struct timespec * tp); 获取进程的时间片。然而,OS X
我最近向应用商店提交了一个新的二进制文件并将其送去审核,但立即被拒绝并显示以下消息。 “不支持的操作 - 不允许应用程序收听设备锁定通知。”。经过一番深入研究后,我发现我们无法使用“com.apple
我对 Linux 还是个新手。 我在 Linux 环境中构建了一个应用程序,它使用基于 cgo ( https://github.com/mattn/go-gtk/) 的 gtk 库。该应用程序在其
我有一个 C 应用程序,我正在尝试为 Mac OS X 10.6.4 编译: $ uname -v Darwin Kernel Version 10.4.0: Fri Apr 23 18:28:53
我正在制作一个流媒体服务器,以在我的移动设备上查看我的网络摄像头的实时视频源。 我考虑使用 ffmpeg 、 VLC 和 DSS 并进行了以下设置,尽管跳过了帧:- video4linux2 > ff
我正在寻找移动视频流服务器,并找到 dss 和 mfpeg 服务器。 有人知道 dss 和 ffmpeg 服务器之间的区别吗?推荐哪一个? 谢谢你 最佳答案 如果您需要具有大量社区覆盖的服务器,请使用
不久前,我记得读过一篇杂志文章(我相信是《连线》),内容是将达尔文进化论应用于程序以创建更好的程序。基本上会产生一个程序的多个突变,并且将选择表现最好的一个进行下一轮突变。 不幸的是,我无法让这个主题
我有 vmware 工作站 14 pro 和 macOS Unlocker 3, 当我运行解锁器时,出现此错误: main() File "gettools.py", line 91, i
我是一名优秀的程序员,十分优秀!