You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
282 volume VI os16<br />
Script e sorgenti del kernel 283<br />
«<br />
1860525 | proc_table[pid].fd[1].fd_flags = 0;<br />
1860526 | proc_table[pid].fd[1].file = file;<br />
1860527 | proc_table[pid].fd[1].file->offset = 0;<br />
1860528 | }<br />
1860529 | }<br />
1860530 | if (proc_table[pid].fd[2].file == NULL)<br />
1860531 | {<br />
1860532 | file = file_stdio_dev_make (device, S_IFCHR, O_WRONLY);<br />
1860533 | if (file != NULL) // stderr<br />
1860534 | {<br />
1860535 | proc_table[pid].fd[2].fl_flags = O_WRONLY;<br />
1860536 | proc_table[pid].fd[2].fd_flags = 0;<br />
1860537 | proc_table[pid].fd[2].file = file;<br />
1860538 | proc_table[pid].fd[2].file->offset = 0;<br />
1860539 | }<br />
1860540 | }<br />
1860541 | //<br />
1860542 | // Prepare to switch<br />
1860543 | //<br />
1860544 | previous_address_i = proc_table[pid].address_i;<br />
1860545 | previous_segment_i = proc_table[pid].segment_i;<br />
1860546 | previous_size_i = proc_table[pid].size_i;<br />
1860547 | previous_address_d = proc_table[pid].address_d;<br />
1860548 | previous_segment_d = proc_table[pid].segment_d;<br />
1860549 | previous_size_d = proc_table[pid].size_d;<br />
1860550 | //<br />
1860551 | proc_table[pid].address_i = allocated_i.address;<br />
1860552 | proc_table[pid].segment_i = allocated_i.segment;<br />
1860553 | proc_table[pid].size_i = allocated_i.size;<br />
1860554 | proc_table[pid].address_d = allocated_d.address;<br />
1860555 | proc_table[pid].segment_d = allocated_d.segment;<br />
1860556 | proc_table[pid].size_d = allocated_d.size;<br />
1860557 | proc_table[pid].sp = new_sp;<br />
1860558 | strncpy (proc_table[pid].name, path, PATH_MAX);<br />
1860559 | //<br />
1860560 | // Ensure to have a terminated string.<br />
1860561 | //<br />
1860562 | proc_table[pid].name[PATH_MAX-1] = 0;<br />
1860563 | //<br />
1860564 | // Free data segment memory.<br />
1860565 | //<br />
1860566 | mb_free (previous_address_d, previous_size_d);<br />
1860567 | //<br />
1860568 | // Free code segment memory if it is<br />
1860569 | // different from the data segment.<br />
1860570 | //<br />
1860571 | if (previous_segment_i != previous_segment_d)<br />
1860572 | {<br />
1860573 | //<br />
1860574 | // Must verify if no other process is<br />
1860575 | // using the same memory.<br />
1860576 | //<br />
1860577 | for (proc_count = 0, extra = 0; extra < PROCESS_MAX; extra++)<br />
1860578 | {<br />
1860579 | if (proc_table[extra].status == PROC_EMPTY ||<br />
1860580 | proc_table[extra].status == PROC_ZOMBIE)<br />
1860581 | {<br />
1860582 | continue;<br />
1860583 | }<br />
1860584 | if (previous_segment_i == proc_table[extra].segment_i)<br />
1860585 | {<br />
1860586 | proc_count++;<br />
1860587 | }<br />
1860588 | }<br />
1860589 | if (proc_count == 0)<br />
1860590 | {<br />
1860591 | //<br />
1860592 | // The code segment can be released, because no other<br />
1860593 | // process is using it.<br />
1860594 | //<br />
1860595 | mb_free (previous_address_i, previous_size_i);<br />
1860596 | }<br />
1860597 | }<br />
1860598 | //<br />
1860599 | // Change the segment and the stack pointer, from the interrupt.<br />
1860600 | //<br />
1860601 | * segment_d = proc_table[pid].segment_d;<br />
1860602 | * sp = proc_table[pid].sp;<br />
1860603 | //<br />
1860604 | return (0);<br />
1860605 |}<br />
104.9.22 kernel/proc/proc_sys_exit.c<br />
Si veda la sezione 103.8.21.<br />
1870001 |#include <br />
1870002 |#include <br />
1870003 |//----------------------------------------------------------------------<br />
1870004 |void<br />
1870005 |proc_sys_exit (pid_t pid, int status)<br />
1870006 |{<br />
1870007 | pid_t child;<br />
1870008 | pid_t parent = proc_table[pid].ppid;<br />
1870009 | pid_t extra;<br />
1870010 | int proc_count;<br />
1870011 | int sigchld = 0;<br />
1870012 | int fdn;<br />
1870013 | tty_t *tty;<br />
1870014 | //<br />
1870015 | proc_table[pid].status = PROC_ZOMBIE;<br />
1870016 | proc_table[pid].ret = status;<br />
1870017 | proc_table[pid].sig_status = 0;<br />
1870018 | proc_table[pid].sig_ignore = 0;<br />
1870019 | //<br />
1870020 | // Close files.<br />
1870021 | //<br />
1870022 | for (fdn = 0; fdn < OPEN_MAX; fdn++)<br />
1870023 | {<br />
1870024 | fd_close (pid, fdn);<br />
1870025 | }<br />
1870026 | //<br />
1870027 | // Close current directory.<br />
1870028 | //<br />
1870029 | inode_put (proc_table[pid].inode_cwd);<br />
1870030 | //<br />
1870031 | // Close the controlling terminal, if it is a process leader with<br />
1870032 | // such a terminal.<br />
1870033 | //<br />
1870034 | if (proc_table[pid].pgrp == pid && proc_table[pid].device_tty != 0)<br />
1870035 | {<br />
1870036 | tty = tty_reference (proc_table[pid].device_tty);<br />
1870037 | //<br />
1870038 | // Verify.<br />
1870039 | //<br />
1870040 | if (tty == NULL)<br />
1870041 | {<br />
1870042 | //<br />
1870043 | // Show a kernel message.<br />
1870044 | //<br />
1870045 | k_printf ("kernel alert: cannot find the terminal item "<br />
1870046 | "for device 0x%04x!\n",<br />
1870047 | (int) proc_table[pid].device_tty);<br />
1870048 | }<br />
1870049 | else if (tty->pgrp != pid)<br />
1870050 | {<br />
1870051 | //<br />
1870052 | // Show a kernel message.<br />
1870053 | //<br />
1870054 | k_printf ("kernel alert: terminal device 0x%04x should "<br />
1870055 | "be associated to the process group %i, but it "<br />
1870056 | "is instead related to process group %i!\n",<br />
1870057 | (int) proc_table[pid].device_tty, (int) pid,<br />
1870058 | (int) tty->pgrp);<br />
1870059 | }<br />
1870060 | else<br />
1870061 | {<br />
1870062 | tty->pgrp = 0;<br />
1870063 | }<br />
1870064 | }<br />
1870065 | //<br />
1870066 | // Free data segment memory.<br />
1870067 | //<br />
1870068 | mb_free (proc_table[pid].address_d, proc_table[pid].size_d);<br />
1870069 | //<br />
1870070 | // Free code segment memory if it is<br />
1870071 | // different from the data segment.<br />
1870072 | //<br />
1870073 | if (proc_table[pid].segment_i != proc_table[pid].segment_d)<br />
1870074 | {<br />
1870075 | //<br />
1870076 | // Must verify if no other process is using the same memory.<br />
1870077 | // The proc_count variable is incremented for processes<br />
1870078 | // active, ready or sleeping: the current process is already<br />
1870079 | // set as zombie, and is not counted.<br />
1870080 | //<br />
1870081 | for (proc_count = 0, extra = 0; extra < PROCESS_MAX; extra++)<br />
1870082 | {<br />
1870083 | if (proc_table[extra].status == PROC_EMPTY ||<br />
1870084 | proc_table[extra].status == PROC_ZOMBIE)<br />
1870085 | {<br />
1870086 | continue;<br />
1870087 | }<br />
1870088 | if (proc_table[pid].segment_i == proc_table[extra].segment_i)<br />
1870089 | {<br />
1870090 | proc_count++;<br />
1870091 | }<br />
1870092 | }<br />
1870093 | if (proc_count == 0)<br />
1870094 | {<br />
1870095 | //<br />
1870096 | // The code segment can be released, because no other<br />
1870097 | // process, except the current one (to be closed),<br />
1870098 | // is using it.<br />
1870099 | //<br />
1870100 | mb_free (proc_table[pid].address_i, proc_table[pid].size_i);<br />
1870101 | }<br />
1870102 | }<br />
1870103 | //<br />
1870104 | // Abandon children to ‘init’ ((pid_t) 1).<br />
1870105 | //<br />
1870106 | for (child = 1; child < PROCESS_MAX; child++)<br />
1870107 | {<br />
1870108 | if ( proc_table[child].status != PROC_EMPTY<br />
1870109 | && proc_table[child].ppid == pid)<br />
1870110 | {<br />
1870111 | proc_table[child].ppid = 1; // Son of ‘init’.<br />
1870112 | if (proc_table[child].status == PROC_ZOMBIE)<br />
1870113 | {<br />
1870114 | sigchld = 1; // Must send a SIGCHLD to ‘init’.<br />
1870115 | }<br />
1870116 | }<br />
1870117 | }<br />
1870118 | //<br />
1870119 | // SIGCHLD to ‘init’.<br />
1870120 | //<br />
1870121 | if ( sigchld<br />
1870122 | && pid != 1<br />
1870123 | && proc_table[1].status != PROC_EMPTY<br />
1870124 | && proc_table[1].status != PROC_ZOMBIE)<br />
1870125 | {<br />
1870126 | proc_sig_on ((pid_t) 1, SIGCHLD);<br />
1870127 | }<br />
1870128 | //<br />
1870129 | // Announce to the parent the death of its child.<br />
1870130 | //<br />
1870131 | if ( pid != parent<br />
1870132 | && proc_table[parent].status != PROC_EMPTY)<br />
1870133 | {<br />
1870134 | proc_sig_on (parent, SIGCHLD);<br />
1870135 | }<br />
1870136 |}<br />
104.9.23 kernel/proc/proc_sys_fork.c<br />
Si veda la sezione 103.8.22.<br />
1880001 |#include <br />
1880002 |#include <br />
1880003 |//----------------------------------------------------------------------<br />
1880004 |pid_t<br />
1880005 |proc_sys_fork (pid_t ppid, uint16_t sp)<br />
«