#include #include #include #include #include #include #include #define SWITCHED_SYSCALL #if defined SWITCHED_SYSCALL static int __NR_sys_vserver = 273; _syscall3(int, sys_vserver, uint32_t, cmd, uint32_t, id, void *, data); #define VC_CAT_COMPAT 63 #define VC_CMD(c,i,v) ((((VC_CAT_ ## c) & 0x3F) << 24) \ | (((i) & 0xFF) << 16) | ((v) & 0xFFF)) #define VCMD_new_s_context VC_CMD(COMPAT, 1, 1) struct vcmd_new_s_context_v1 { uint32_t remove_cap; uint32_t flags; }; static char opt_static = 0; static int gxid = 10; #else static int __NR_new_s_context = 227; _syscall4(int, new_s_context, int, nbctx, int *, ctxs, int, remove_cap, int, flags); #endif //---------------------------------------------------------------------- void start_ctx(int ctx_in) { int pid; int xid; gxid ^= (ctx_in << 3); gxid &= 32767; switch (pid=fork()) { case 0: case -1: break; default: if (opt_static) xid = gxid; else xid = -1; { int ctx = 0; #if defined SWITCHED_SYSCALL struct vcmd_new_s_context_v1 data = { 0, 0 }; ctx = sys_vserver(VCMD_new_s_context, xid, &data); if (opt_static) ctx = xid; #else int ctxs[16]; ctxs[0] = xid; ctx = new_s_context(1, ctxs, 0, 0); #endif printf("ctx: %d\n", ctx); exit(0); } } } //---------------------------------------------------------------------- void loop() { printf("loop()\n"); while (1) { start_ctx(gxid++); } } //---------------------------------------------------------------------- int main(int argc, char **argv) { int i = 2; int flags = 0; if (argc > 1) { flags = atoi(argv[1]); } opt_static = (flags & 0x1); signal(SIGCHLD, SIG_IGN); while (i--) { if (!fork()) { loop(); } } while (1) { printf("%d\r", ++i); fflush(stdout); sleep(1); } } //----------------------------------------------------------------------