奇怪的fork()行为(先前的printf被调用)

时间:2019-10-10 15:58:53

标签: c printf fork

我正在尝试解决一个学校模拟问题,即模拟一个有一个雇员(父流程)和多个顾客(子流程)的商店。我简化了下面的代码以突出测试时遇到的问题:

#define N_CUSTOMERS 10

void employee() {
}

void customer(int id) {
    exit(0);
}

int main() {

    printf("working!");

    // create customers
    for(int i = 0; i < N_CUSTOMERS; i++)
        if(!fork())
            customer(i);

    // be employee
    employee();

    // end
    exit(0);
}

输出为(使用gcc -Wall -pthread store.c -o store编译):

  

工作,工作,工作,工作,工作,工作,工作,工作,工作,工作,

我希望printf仅由父进程执行一次,但是,似乎为每个子进程创建了打印。

我在这里想念什么?

1 个答案:

答案 0 :(得分:5)

describe('Component', () => { beforeEach(() => { let mockTopToolBarService: jasmine.SpyObj<TopToolBarService>; mockTopToolBarService = jasmine.createSpyObj('TopToolBarService', ['getCustomer']); mockTopToolBarService.getCustomer.and.returnValue("king"); TestBed.configureTestingModule({ declarations: [Component], providers: [{ provide: TopToolBarService, useValue: mockTopToolBarService}] }); const fixture = TestBed.createComponent(Component); component = fixture.componentInstance; fixture.detectChanges(); }); it ('should check return value of service', () => { var result = component.getCustomer(); expect(result).toBe("king"); }); }); 使用行缓冲输出。由于打印的字符串没有printf,因此不会在'\n'之前打印。在fork()上,缓冲区被刷新,这发生在父级和所有子级中。