Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.51 MB, 19 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">
<b>File test_fork.c</b>
/*####################################### University of Information Technology# IT007 Operating System
? ? ? ? // In ra pid và ppid cu0a tiề9n trình hiện tại
? ? ? ? printf(parents | pid = %ld | ppid\n" long)getpid(),? ? ? ? ? ? ? ?(long)getppif());
? ? ? ? // Nề9u có nhiề=u hơn 2 đố9i số9 in ra số9 lửợng đố9i số9? ? ? ? if (argc >2
? ? ? ? ? ? printf(PARENTS | There are %d arguments\n" argc - 1);? ? ? ? // Tiề9n trình cha đợi tiề9n trình con kề9t thúc
? ? ? ? wait(NULL);? ? }
? ? // Thống tin về= tiề9n trình con và các đố9i số9 đửợc in ra? ? if(pid == 0
? ? {
? ? ? ? printf(CHILDREN | PID = %ld | PPID = %ld\n" long)getpid(),
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">? ? ? ? ? ? ? ?(long)getppid());
? ? ? ? printf(CHILDEN | List of arguments: \n");
? ? ? ? // In ra danh sách các đố9i số9 đửợc truyề=n vào chửơng trình? ? ? ? for int ; i<argc;i++)
? ? ? ? {
? ? ? ? ? ? printf(%s\n" argv[]);? ? ? ? }
? ? }? ? exit();}
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4"># Lọc ea những dịng có chứa chuối ‘count.sh’i1
# Khơ0i tạo biề9n i với giá trị là 1
# Dừng script trong giây1done
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">? ? __pid_t pid;? ? pid fork();
? ? // Đây là phâ=n mã cu0a tiề9n trình cha? ? if(pid >0
? ? {
? ? ? ? // In ra PID và PPID cu0a tiề9n trình cha
? ? ? ? printf(PARENTS | PID = %ld | PPID = %ld\n", (long)getpid(),? ? ? ? ? ? ? ?(long)getppid());
? ? ? ? // Nề9u có nhiề=u hơn 2 đố9i số9, in ra số9 lửợng đố9i số9? ? ? ? if (argc >2
? ? ? ? ? ? printf(PARENTS | There are %d arguments\n" argc - 1);? ? ? ? // Tiề9n trình cha đợi tiề9n trình con kề9t thúc
? ? ? ? wait(NULL);? ? }
? ? // Đây là phâ=n mã cu0a tiề9n trình con? ? if(pid == 0
? ? {
? ? ? ? // Tiề9n trình con thực thi script ‘count.sh’ với đố9i số9 là ‘10’? ? ? ? execl("./count.sh", ./count.sh", "10" NULL);
? ? ? ? // In ra PID và PPID cu0a tiề9n trình con
? ? ? ? printf(CHILDREN | PID = %ld | PPID = %ld\n" long)getpid(),? ? ? ? ? ? ? ?(long)getppid());
? ? ? ? printf(CHILDREN | List of arguments: \n");
? ? ? ? // In ra danh sách các đố9i số9 đửợc truyề=n vào chửơng trình? ? ? ? for int ; i<argc;i++)
? ? ? ? {
? ? ? ? ? ? printf(%s\n" argv[]);? ? ? ? }
? ? }? ? exit();
? ? // Kề9t thúc chửơng trình với mã thốt là 0, biề0u thị rằng chửơng
3. Output từ script bash ‘count.sh, nó in ra tên của script hiện tại.
4. Tiếp tục là output từ script bash ‘count.sh’, nó in ra chuỗi “PPID of count.sh: ”.5. Đây là output từ lệnh ps -ef | grep count.sh trong script bash ‘count.sh’. Nó in rathơng tin về tiến trình đang chạy script ‘count.sh’. Trong đó, PID của tiến trình nàylà 5661 và PPID của nó (là tiến trình cha đã tạo ra nó) là 5660.
6. Đây cũng là output từ lệnh ps -ef | grep count.sh, nhưng nó liên quan đến tiến trình grep mà lệnh này đã tạo ra để lọc kết quả. PID của tiến trình grep này là 5663 và PPID của nó (tiến trình cha đã tạo ra nó) là 5661.
<b>File test_system.c:</b>
/*####################################### University of Information Technology# IT007 Operating System
? ? // Nề9u có nhiề=u hơn 2 tham số9 đâ=u vào, in ra số9 lửợng tham số9? ? if(argc > 2
? ? {
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">? ? ? ? printf(%s\n" argv[ ]);? ? }
? ? // Kề9t thúc chửơng trình với mã lốdi 0 (tức khống có lốdi xa0y ra)? ? exit();
3. Cho biết rằng chương trình đang thực thi script shell count.sh.
4. Thơng tin về các tiến trình liên quan đến việc thực thi script shell count.sh. Cụ thể, sh –c ./count.sh 10 là tiến trình shell được tạo ra bởi hàm system() để thực thi script và /bin/bash ./count.sh 10 là tiến trình của script shell count.sh đang chạy.
5. Danh sách các đối số đầu vào mà bạn đã truyền vào chương trình.
/*####################################### University of Information Technology# IT007 Operating System
#include stdio.h> ? ?// Thử viện chuâ0n C cho I/O
#include stdlib.h> ? // Thử viện chuâ0n C cho các hàm nhử malloc, free, exit,...
#include string.h> ? // Thử viện chuâ0n C cho các hàm xử0 lý chuốdi#include fcntl.h> ? ?// Thử viện POSIX cho file control
#include sys/shm.h> ?// Thử viện POSIX cho shared memory
#include sys/stat.h>// Thử viện POSIX cho các hàm xử0 lý file status1.
5.
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">#include unistd.h> ? // Thử viện POSIX cho các hàm nhử close, write, read,...
#include sys/mman.h>// Thử viện POSIX cho memory managementint main()
? ? // Kích thửớc (theo byte) cu0a đố9i tửợng bộ nhớ chia se0? ? const int SIZE =4096;
? ? // Tền cu0a đố9i tửợng bộ nhớ chia se0? ? const char name OS";
? ? // File descriptor cho bộ nhớ chia se0? ? int fd;
? ? // Con tro0 đề9n đố9i tửợng bộ nhớ chia se0? ? char ptr;
? ? // Tạo đố9i tửợng bộ nhớ chia se0
? ? fd = shm_open(name,O_CREAT | O_RDWR, 0666);? ? // Câ9u hình kích thửớc cu0a đố9i tửợng bộ nhớ chia se0? ? ftruncate(fd, SIZE);
? ? // Ánh xạ bộ nhớ cu0a đố9i tửợng bộ nhớ chia se0
? ? ptr mmap( ,0 SIZE,PROT_READ PROT_WRITE, MAP_SHARED,fd, 0);? ? // Ghi vào đố9i tửợng bộ nhớ chia se0
? ? strcpy(ptr,"Hello Process B");
? ? // Chờ cho đề9n khi process B cập nhật phân đoạn bộ nhớ chia se0? ? while(strncmp(ptr,"Hello Process B" 15)== )
? ? {
? ? ? ? printf(Waiting Process B update shared memory\n");? ? ? ? sleep( );1
? ? }
? ? printf( Memory updated: %s\n", (char *)ptr);
? ? // Hu0y ánh xạ phân đoạn bộ nhớ chia se0 và đóng file descriptor? ? munmap(ptr,SIZE);
? ? close(fd);? ? return0}
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">Chương trình A sẽ tạo ra một đối tượng bộ nhớ chia sẻ và ghi chuỗi “Hello Process B” vào đó, sau đó liên tục in ra thơng báo “Waiting Process B updated shared memory” cho đến khi chương trình B cập nhật bộ nhớ chia sẻ.
/*####################################### University of Information Technology# IT007 Operating System
#include stdio.h> ? ?// Thử viện chuâ0n C cho I/O
#include stdlib.h> ? // Thử viện chuâ0n C cho các hàm nhử malloc, free, exit,...
#include string.h> ? // Thử viện chuâ0n C cho các hàm xử0 lý chuốdi#include fcntl.h> ? ?// Thử viện POSIX cho file control
#include sys/shm.h> ?// Thử viện POSIX cho shared memory
#include sys/stat.h>// Thử viện POSIX cho các hàm xử0 lý file status#include unistd.h> ? // Thử viện POSIX cho các hàm nhử close, write, read,...
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">#include sys/mman.h>// Thử viện POSIX cho memory managementint main()
? ? // Kích thửớc (theo byte) cu0a đố9i tửợng bộ nhớ chia se0? ? const int SIZE =4096;
? ? // Tền cu0a đố9i tửợng bộ nhớ chia se0? ? const char name OS";
? ? // File descriptor cho bộ nhớ chia se0? ? int fd;
? ? // Con tro0 đề9n đố9i tửợng bộ nhớ chia se0? ? char ptr;
? ? // Mơ0 đố9i tửợng bộ nhớ chia se0 đã tố=n tại? ? fd = shm_open(name,O_RDWR,0666);
? ? printf( Shared memory updated: %s\n" ptr);? ? sleep( );5
? ? // Hu0y ánh xạ phân đoạn bộ nhớ chia se0 và đóng file descriptor? ? munmap(ptr,SIZE);
? ? close(fd);
? ? // Gỡ bo0 đố9i tửợng bộ nhớ chia se0? ? shm_unlink(name);
? ? return0}
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">? ? }
? ? structtimeval start,end;
? ? // Lâ9y thời gian hiện tại và lửu vào biề9n start? ? gettimeofday(&start, NULL);
? ? // Tạo một tiề9n trình con? ? __pid_t pid =fork();? ? // Nề9u đây là tiề9n trình con? ? if(pid == 0
? ? {
? ? ? ? // Thực thi lệnh đửợc truyề=n vào từ dòng lệnh
? ? ? ? if (execl(/bin/sh" /bin/sh" -c", argv[], NULL) == -1? ? ? ? {
? ? ? ? ? ? printf(Lốdi: khống thề0 thực thi lệnh\n");? ? ? ? ? ? return1
? ? ? ? }? ? }
? ? // Nề9u đây là tiề9n trình cha? ? else if pid )
? ? {
? ? ? ? // Chờ tiề9n trình con kề9t thúc? ? ? ? wait(NULL);
? ? ? ? // Lâ9y thời gian hiện tại và lửu vào biề9n end? ? ? ? gettimeofday(&end,NULL);
? ? ? ? // Tính thời gian thực thi bằng cách lâ9y thời gian kề9t thúc trừ
? ? ? ? double ans end.tv_sec -start.tv_sec) + (( end.tv_usec ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?start.tv_usec)/? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1000000.0);? ? ? ? // In ra thời gian thực thi
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">-? -? -? -? printf(Thời gian thực thi: %.5f giây\n" ans);? ? }
? ? // Nề9u có lốdi xa0y ra khi tạo tiề9n trình con? ? else
? ? {
? ? ? ? printf(Lốdi: khống thề0 tạo tiề9n trình con\n");? ? ? ? return 1
? ? }? ? return0}
int main(){
echo PPID of count.sh: "
ps -ef grep count.sh
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">while [$i -le $1 ]
echo $i >> count.txti=$((i +1))sleep
exit
echo Implementing: $0"
echo PPID of count.sh: "
ps -ef grep count.shcleanup()
{echo \n"
echo count.sh has stopped"
exit }
trap cleanup INT
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">while [$i -le $1 ]
echo $i >> count.txti=$((i +1))sleep
Sử dụng kỹ thuật shared-memory để tạo một bounded-buffer có độ lớn là 10 bytes.
Tiến trình cha đóng vai trị là Producer, tạo một số ngẫu nhiên trong khoảng [10, 20] và ghi dữ liệu vào buffer.
Tiến trình con đóng vai trị là Consumer đọc dữ liệu từ buffer, in ra màn hình và tính tổng.Khi tổng lớn hơn 100 thì cả 2 dừng lại.
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">? ? const int BUFFER_SIZE =10; // Định nghĩa kích thửớc buffer? ? const char name OS"; ? ?// Tền cu0a shared-memory object? ? // Tạo shared-memory object
? ? int shm_fd shm_open(name,O_CREAT O_RDWR, 0666);? ? // Câ9u hình kích thửớc cu0a shared-memory object? ? ftruncate(shm_fd, sizeof int( ) *(BUFFER_SIZE ));? ? // Mapping shared-memory object
? ? int buffer =mmap(, sizeof int( ) * (BUFFER_SIZE +1), PROT_READPROT_WRITE, MAP_SHARED,shm_fd, );
? ? // Kiề0m tra xem map có thành cống khống? ? if(buffer == MAP_FAILED)
? ? {
? ? ? ? perror("mmap");? ? ? ? return 1? ? }
? ? int sum buffer BUFFER_SIZE; // Lửu tố0ng vào cuố9i buffer
? ? __pid_t pid =fork(); ? ? ? ? ? ?// Tạo một tiề9n trình con? ? // Tiề9n trình con (consumer)
? ? if(pid == 0? ? {
? ? ? ? while (*sum <= 100) // Chạy cho đề9n khi tố0ng lớn hơn 100? ? ? ? {
? ? ? ? ? ? // Duyệt qua từng phâ=n tử0 trong buffer? ? ? ? ? ? for int ; i< BUFFER_SIZE;i++)? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (buffer i[ ] !=0 // Nề9u phâ=n tử0 khống rốdng? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? printf(Consumer reads %d\n" buffer[]); // In giá
? ? ? ? printf(Sum > 100, Consumer stops\n"); // In thống báo khi tố0ng >100
? ? }
? ? else if pid )? ? {
? ? ? ? // Tiề9n trình cha (Producer)
? ? ? ? while (*sum <= 100) // Chạy cho đề9n khi tố0ng lớn hơn 100? ? ? ? {
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">? ? ? ? ? ? // Duyệt qua từng phâ=n tử0 trong buffer? ? ? ? ? ? for int ; i< BUFFER_SIZE;i++)? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (buffer i[ ] ==0 // Nề9u phâ=n tử0 rốdng? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? // Tạo một số9 ngâdu nhiền trong [10, 20] và gán vào
? ? ? ? ? ? ? ? ? ? buffer[]= rand() 11 10;? ? ? ? ? ? ? ? ? ? // In ra giá trị đã ghi vào phâ=n tử0? ? ? ? ? ? ? ? ? ? printf(Producer writes %d\n" buffer[ ]);? ? ? ? ? ? ? ? }
? ? ? ? ? ? }? ? ? ? }
? ? ? ? printf(Sum > 100, Producer stops\n"); // In thống báo khi tố0ng >100
? ? ? ? wait(NULL); ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Đợi tiề9n trình con kề9t thúc
? ? ? ? // Xóa shared-memory object? ? ? ? shm_unlink(name);
? ? }? ? else
? ? {
? ? ? ? // fork failed? ? ? ? perror("fork");? ? ? ? return 1? ? }
? ? return0}
? ? ? ? printf(Vui lòng nhập một số9 dửơng: ");? ? ? ? return 1
? ? buffer =mmap(NULL,sizeof int( )*( + 1), PROT_READ PROT_WRITE,
MAP_SHARED |MAP_ANONYMOUS, - ,1 );? ? pid fork();
? ? if(pid == 0? ? {
? ? ? ? // Tiề9n trình con? ? ? ? int ;? ? ? ? while ( != )? ? ? ? {
? ? ? ? ? ? buffer[++] = n? ? ? ? ? ? if ( == )? ? ? ? ? ? ? ? n /=2? ? ? ? ? ? else
? ? ? ? ? ? ? ? n =3* n+1? ? ? ? }
? ? ? ? buffer[] =n ? ? ?// Thềm số9 cuố9i cùng (1) vào chuốdi? ? ? ? buffer[ +1 - ;1 // Đánh dâ9u kề9t thúc chuốdi? ? }
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">? ? ? ? // Dọn dẹp bộ nhớ chia se0
? ? ? ? munmap(buffer, sizeof int( )* ( +1));? ? }
? ? return0}