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