使用clone()进行进程切换

使用clone()进行进程切换

现在,我必须编写 ac 程序并使用它clone()来使进程异步执行操作。我读过手册clone();但是,我仍然不知道如何使其异步工作。我使用 flags CLONE_THREADCLONE_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()

相关内容