现在,我必须编写 ac 程序并使用它clone()
来使进程异步执行操作。我读过手册clone()
;但是,我仍然不知道如何使其异步工作。我使用 flags CLONE_THREAD
,CLONE_VM
并且CLONE_SIGHAND
参数中有一个无限循环fn
。我segmentation fault(core dumped)
先得到了,然后用来gdb
调试。然后,我得到了Program received signal SIGSEGV, Segmentation fault. [Switching to LWP xxx]
。我想让进程切换成功?
下面是我的代码:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#define FIBER_STACK 1024*1024*8
int counter;
void * stack;
int do_something(){
int i;
while(1) {
if (counter == 1000)
{
free(stack);
exit(1);
} else {
counter++;
i++;
}
printf("Process %d running total runs %d, and this process runs %d \n", getpid(), counter, i);
}
}
int main() {
void * stack;
counter = 1;
stack = malloc(FIBER_STACK);
if(!stack) {
printf("The stack failed\n");
exit(0);
}
int i;
for (i = 0; i < 26; i++)
{
clone(&do_something, (char *)stack + FIBER_STACK, CLONE_THREAD|CLONE_SIGHAND|CLONE_VM, 0); // CLONE_VFORK
}
}
答案1
我首先遇到分段错误(核心转储)
当然。给克隆一个堆栈的要点是它需要内存它自己的。但你递给相同的堆栈26 个不同的流程!这也是一个“差一”错误:
(char *)stack + FIBER_STACK
因为如果堆栈从 0x1 开始并且 FIBER_STACK 为 5,则它被分配 5 个地址:0x1、0x2、0x3、0x4、0x5。但0x1 + 5 是0x6。所以你应该从中减去 1。
不管怎样,尝试一下:
#define NUM_PROC 8
int main() {
void *stack[NUM_PROC];
// --std=c99
for (int i = 0; i < NUM_PROC; i++) {
stack[i] = malloc(FIBER_STACK);
if(!stack[i]) {
printf("Out of memory?!\n");
exit(0);
}
}
for (i = 0; i < NUM_PROC; i++) {
clone(&do_something, (char *)stack[i] + FIBER_STACK - 1,
并且它会毫无故障地运行。但要保持主要流程,您还需要,例如:
while (counter < 1000) sleep(1);
循环之后for()
。