프로세스 전환을 위해 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가지의 다양한 프로세스! 이는 "하나씩 해제" 오류이기도 합니다.

(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().

관련 정보