我正在尝试解决一个学校模拟问题,即模拟一个有一个雇员(父流程)和多个顾客(子流程)的商店。我简化了下面的代码以突出测试时遇到的问题:
#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
仅由父进程执行一次,但是,似乎为每个子进程创建了打印。
我在这里想念什么?
答案 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()
上,缓冲区被刷新,这发生在父级和所有子级中。