#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; }; #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 = fork (); switch (pid) { case 0: case -1: break; default: { int ctx = 0; #if defined SWITCHED_SYSCALL struct vcmd_new_s_context_v1 data = {0,0}; ctx = sys_vserver (VCMD_new_s_context, -1, &data); #else int ctxs[16]; ctxs[0] = -1; 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 (0); } } //---------------------------------------------------------------------- int main (int argc, char ** argv) { int i = 2; signal (SIGCHLD, SIG_IGN); while (i--) { if (!fork()) { loop (); } } while (1) { printf ("%d\r", ++i); fflush (stdout); sleep (1); } } //----------------------------------------------------------------------