プロセス切り替えに clone() を使用する [閉じる]

プロセス切り替えに clone() を使用する [閉じる]

これで、acプログラムを作成し、それを使用してプロセスに非同期的にタスクclone()を実行させる必要があります。私が読んで手動clone();しかし、まだ非同期的に動作させる方法がわかりません。私はフラグを使用していますが、CLONE_THREADパラメータに無限ループがCLONE_VMあります。まず受け取り、デバッグに使用しました。それから、私はそれを得ました。プロセス移行に成功したいですか?CLONE_SIGHANDfnsegmentation fault(core dumped)gdbProgram 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のさまざまなプロセス!これは「1つずつ解放」エラーでもあります。

(char *)stack + FIBER_STACK

スタックが0x1で始まり、FIBER_STACKが5の場合、0x1、0x2、0x3、0x4、0x5の5つのアドレスが割り当てられるためです。しかし、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()

関連情報