- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我实现了系统调用宏来调用软件中断调用。它对许多系统调用都运行良好。但是,它不适用于 fork()
。父进程和子进程的返回 pid 相同。片段如下:
#define SYSCALL0(N) ({ \
register int ip asm("ip") = N; \
register int r0 asm("r0"); \
asm volatile("swi 0x80" : "=r"(r0) : "r"(ip) : "memory"); \
r0; \
})
int main(int argc, char * argv[]) {
NSLog(@"--beginning of program\n");
int counter = 0;
pid_t pid = SYSCALL0(2);
if (pid == 0) {
NSLog(@"pid = %d", getpid());
// child process
for (int i = 0; i < 3; ++i)
NSLog(@"child process: counter=%d\n", ++counter);
}
else if (pid > 0) {
NSLog(@"pid = %d", getpid());
// parent process
for (int i = 0; i < 3; ++i)
NSLog(@"parent process: counter=%d\n", ++counter);
}
else {
// fork failed
NSLog(@"fork() failed!\n");
return 1;
}
NSLog(@"--end of program--\n");
}
输出:
2015-10-11 21:29:43.666 Training[2564:907] --beginning of program
2015-10-11 21:29:43.669 Training[2564:907] pid = 2650
2015-10-11 21:29:43.670 Training[2564:907] parent process: counter=1
2015-10-11 21:29:43.670 Training[2564:907] parent process: counter=2
2015-10-11 21:29:43.669 Training[2564:907] pid = 2650
2015-10-11 21:29:43.671 Training[2564:907] parent process: counter=3
2015-10-11 21:29:43.671 Training[2564:907] --end of program--
2015-10-11 21:29:43.671 Training[2564:907] parent process: counter=1
2015-10-11 21:29:43.672 Training[2564:907] parent process: counter=2
2015-10-11 21:29:43.673 Training[2564:907] parent process: counter=3
2015-10-11 21:29:43.674 Training[2564:907] --end of program--
测试环境是在armv7上运行的越狱iOS(非越狱不会运行)。我想我可能对 swi 调用的返回做得不够,所以它不能返回 0 来指示子进程。我错过了什么?如何让它正常工作?
最佳答案
你不能那样做系统调用。正如您刚刚注意到的,系统调用的用户空间包装器所做的工作远不止于此。因此,要么找到适用于您的操作系统的源代码,弄清楚系统调用是如何包装的并执行相同的操作,要么只使用为您提供的方便的包装器。
我很确定 iOS 仍然以 BSD 方式进行系统调用。我碰巧知道fork使用了两个返回值系统调用接口(interface),一个寄存器包含进程是否为子进程,另一个寄存器包含返回值。
此外,您的包装器可能没有正确处理错误(这通常通过您必须专门处理的标志发出信号)。并且至少一些操作系统(不知道 iOS 是否是其中之一)确切地知道哪些寄存器保存在系统调用包装器中并且不会费心去保存它们,所以像这样内联系统调用可能会破坏你的寄存器。
关于ios - fork() 通过使用 svc 调用实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32985409/
我正在为一个简单的循环而苦苦挣扎: for kernel in ('linear','poly', 'rbf'): svm = svm.SVC(kernel=kernel, C=1)
我正在为一个简单的循环而苦苦挣扎: for kernel in ('linear','poly', 'rbf'): svm = svm.SVC(kernel=kernel, C=1)
我需要在所有资源上使用 VNET 集成,但似乎如果我已经在 app-svc 中使用它,则不需要在应用程序服务计划级别指定它。我在这里缺少什么吗? Web 应用程序工作正常,但我想也许我因为没有在服务计
我需要在所有资源上使用 VNET 集成,但似乎如果我已经在 app-svc 中使用它,则不需要在应用程序服务计划级别指定它。我在这里缺少什么吗? Web 应用程序工作正常,但我想也许我因为没有在服务计
我使用 sklearn.svm.SVC 构建支持向量分类器,如下所示。 import numpy as np from sklearn.svm import SVC svc=SVC(proba
我认为它应该是相同的,但是对于方法 decision_function() 我得到了不同的结果。而只有 decision_function_shape='ovr' 的 SVC 确实更快。 相关:Sci
是否可以设置 Activity 探针来检查是否存在单独的服务?对于一个pod中的一个应用程序以及一个单独的pod中的一个数据库,我希望该app pod检查数据库pod的活跃性,而不是检查此pod本身。
ARM SVC 处理程序以哪种模式启动? 基本上,我想知道引发 SVC 异常时 ARM 内核处于哪种模式? 似乎无法在 ARM ARM 中找到它,但我的猜测是它在 Supervisor 中启动。 最佳
我使用 SVC 文件在 WAS 托管我的服务: 但是如您所见,它没有应有的 CodeBehind Attrbiute。及其工作原理。 怎么样? http://msdn.microsoft.com/e
给定一个以 .svc 结尾且应该运行 SOAP 网络服务的 URL,我如何从中获取一些数据? 我试过: 通过网络浏览器访问它 通过 Python 的库 Zeep 访问它 通过 Microsoft 实用
假设我有一个简单的 aarch64 函数,它通过 SVC 进行系统调用,看起来像这样(iOS 目标): make_syscall: stp fp, lr, [sp, #-16]! ad
我需要将 .svc 文件添加到已添加到解决方案中的 WCF 服务库(这没有 .svc 文件)。如果我通过广告新项目(例如 test.svc)指定此文件,则这是一个安装程序文件,而不是 WCF 文件。
与 asmx 文件相比,如何进入显示服务可用方法的可视化服务页面? http://soweb.adwiza.com/person.asmx 相对 http://soweb7.adwiza.com/re
我正在处理机器学习问题,但我遇到了使用 MultiOutputClassifier 可以运行的类(class)数量限制和 SVC .特别是,当类数> 14 时,拟合失败。我按照 MultiOutput
我有一个 WPF 应用程序,它使用 WCF 服务对使用 EF4 的实体执行操作。 我的项目结构如下: 项目:实体对象 这是 edmx 文件所在的位置 项目:WCFService 引用实体对象 具有对实
我正在尝试在数据集中拟合一个简单的SVC模型。一旦运行代码,就会出现弹出窗口,提示python.exe停止工作。 这是我的代码: Xtrain, Xtest, Ytrain, Ytest = trai
我正在研究 Cortex-M4 上的上下文保存和恢复机制,以便我可以实现简单的多任务处理。我使用 arm-none-eabi-g++ 来编译这段代码。便携性目前不是问题。 当任务可以调用 yield
我正在使用带有线性内核的 SVC 分类器来训练我的模型。列车数据:42000条记录 model = SVC(probability=True) model.fit(self.featu
我下载了数据。 news = datasets.fetch_20newsgroups(subset='all', categories=['alt.atheism', 'sci.space']) ve
我正在使用 SVM 分类器进行多类分类。 我希望 svc.predict 返回结果以及其他类的概率。 我得到的结果是这样的: print(svclassifier.predict([[79,93,60
我是一名优秀的程序员,十分优秀!