24.01.2014 Views

Codice

Codice

Codice

SHOW MORE
SHOW LESS

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 />

«

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!