これで、acプログラムを作成し、それを使用してプロセスに非同期的にタスクclone()
を実行させる必要があります。私が読んで手動clone()
;しかし、まだ非同期的に動作させる方法がわかりません。私はフラグを使用していますが、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のさまざまなプロセス!これは「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()
。