Changeset 434 for trunk/user/init/init.c
- Timestamp:
- Feb 14, 2018, 3:41:31 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/user/init/init.c
r427 r434 5 5 /////////////////////////////////////////////////////////////////////////////////////// 6 6 // This single thread application implement the "init" process for ALMOS-MKH. 7 // -It uses the fork/exec syscalls to create N KSH child processes8 // (one child process per user terminal), and register the corresponding PIDs9 // in the ksh_pid[] array. Then it calls the wait() function to block.10 // - It is reactivated when any child KSH process is terminated by a SIGKILL signal,11 // or stopped by a SIGSTOP signal. In case of SIGKILL, it scan all registered KSH12 // processes and re-creates each killed KSH process, using a new fork/exec.13 // It includes the hard_config.h file to get the NB_TXT_CHANNELS parameter.7 // It uses the fork/exec syscalls to create N KSH child processes 8 // (one child process per user terminal). 9 // It includes the hard_config.h file to get th NB_TXT_CHANNELS parameter. 10 // 11 // TODO : Register the PIDs for all KSH[i] in a ksh_pid[] array. 12 // Then calls the wait() function to block, and reactivate any child KSH process 13 // that has been deleted, using a new fork/exec. 14 14 /////////////////////////////////////////////////////////////////////////////////////// 15 15 … … 20 20 #include <pthread.h> 21 21 22 #define NB_KSH (NB_TXT_CHANNELS - 1) 23 22 #define DELAY_BETWEEN_FORK 100000 24 23 25 24 ////////// … … 27 26 { 28 27 int i; 29 int ret; // fork return value 30 int child_pid; 31 int status; // used by the wait function 28 int ret_fork; // fork return value 29 int ret_exec; // fork return value 30 int received_pid; // pid received from the wait syscall 31 int status; // used by the wait syscall 32 32 char string[64]; 33 33 … … 36 36 37 37 // create the KSH processes (one per user terminal) 38 for( i = 0 ; i < NB_KSH; i++ )38 for( i = 1 ; i < NB_TXT_CHANNELS ; i++ ) 39 39 { 40 // INIT process fork process CHILD41 ret = fork();42 40 43 if( ret < 0 ) // error in fork 41 snprintf( string , 64 , "@@@ before fork / iter = %d\n" , i ); 42 display_string( string ); 43 44 // INIT process fork process CHILD[i] 45 ret_fork = fork(); 46 47 snprintf( string , 64 , "@@@ after fork / iter = %d / ret_fork = %d\n" , i , ret_fork ); 48 display_string( string ); 49 50 if( ret_fork< 0 ) // error in fork 44 51 { 45 // display error message on TXT0 terminal 46 display_string( "init process cannot fork\n" ); 47 48 // INIT process exit 49 exit( 1 ); 50 } 51 else if( ret > 0 ) // we are in INIT process 52 { 53 // INIT display string on kernel TXT0 54 snprintf( string , 64 , "INIT created KSH[%d]\n" , i ); 52 // INIT display error message on TXT0 terminal 53 snprintf( string , 64 , "init cannot fork child[%d]\n" , i ); 55 54 display_string( string ); 56 55 57 // INIT process deschedule58 pthread_yield();56 // INIT exit 57 exit( 0 ); 59 58 } 60 else // we are in CHILDprocess59 else if( ret_fork == 0 ) // we are in CHILD[i] process 61 60 { 62 // CHILD process exec process KSH 63 if ( exec( "/bin/user/ksh.elf" , NULL , NULL ) ) // CHILD failure 61 // CHILD[i] process exec process KSH[i] 62 ret_exec = exec( "/bin/user/ksh.elf" , NULL , NULL ); 63 64 if ( ret_exec ) // error in exec 64 65 { 65 66 // display error message on TXT0 terminal 66 display_string( "child process cannot exec process ksh\n" ); 67 snprintf( string , 64 , "child[%d] cannot exec ksh[%d]\n" , i , i ); 68 display_string( string ); 67 69 68 // CHILD process exit 69 exit( 1 ); 70 } 71 else // child success 72 { 73 // CHILD process deschedule 74 pthread_yield(); 70 // CHILD[i] exit 71 // exit( 0 ); 75 72 } 76 73 } 77 } 74 else // we are in INIT process 75 { 76 // INIT display CHILD[i] process PID 77 snprintf( string , 64 , "INIT forked CHILD[%d] / pid = %x\n", i , ret_fork ); 78 display_string( string ); 78 79 80 // INIT delay 81 int x; 82 for( x=0 ; x<DELAY_BETWEEN_FORK ; x++) asm volatile ("nop"); 83 84 /* 85 // INIT wait exec completion by CHILD[i] 86 while( 1 ) 87 { 88 // get terminating process PID 89 received_pid = wait( &status ); 90 91 if( received_pid == ret_fork ) break; 92 else 93 { 94 snprintf( string , 64 , 95 "expected_pid %d / received_pid %d" , ret_fork , received_pid ); 96 display_string( string ); 97 } 98 } 99 100 */ 101 // INIT display string on kernel TXT0 102 snprintf( string , 64 , "INIT created KSH[%d]\n", i ); 103 display_string( string ); 79 104 // @@@ 80 display_string( "@@@ INIT process created all KSH processes\n" );81 105 display_process( 0 ); 82 106 display_sched( 0 , 0 ); 83 107 // @@@ 108 } 109 110 } 84 111 85 112 // This blocking loop is only for debug, because KSH[i] processes 86 // should never be killed, and INIT should never exitthe wait() function.113 // should never be killed, and INIT should never return from the wait() function. 87 114 while( 1 ) 88 115 { 89 116 // block on child process termination 90 child_pid = wait( &status );117 received_pid = wait( &status ); 91 118 92 // build a string to report unexpected KSH process termination 93 snprintf( string , 64 , "KSH process %x unexpectedly terminated" , child_pid ); 94 95 // display string on kernel TXT0 (INIT has no TXT terminal) 119 // display string to report unexpected KSH process termination 120 snprintf( string , 64 , "KSH process %x unexpectedly terminated" , received_pid ); 96 121 display_string( string ); 97 122 }
Note: See TracChangeset
for help on using the changeset viewer.