【實驗要求】:html
學習fork函數,exec函數,pthread函數的使用,閱讀源碼,分析三個函數的機理。ide
【代碼實現】:函數
進程A建立子進程B學習
進程A打印hello world,進程B實現Sum累加this
進程B有兩個線程,主線程建立子線程實現Sum累加spa
分析各執行體處理器使用,內存使用等基本信息.net
【分析】線程
要寫這個先得看fork exec pthread函數啦!code
有幾個博客頗有幫助htm
http://www.javashuo.com/article/p-qdolmsid-dt.html
https://blog.csdn.net/nan_lei/article/details/81636473
https://blog.csdn.net/u011279649/article/details/18736181
看完了這個基本上能夠開始寫了
源代碼很簡單,分紅兩個文件,一個處理線程,一個建立進程B
處理進程的main.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 #include <unistd.h> 5 #include <sys/types.h> 6 #include <wait.h> 7 8 int main() { 9 pid_t pid; 10 pid = fork(); 11 //devide father and child 12 if (pid < 0) { 13 printf("Fork failed\n"); 14 exit(-1); 15 } 16 17 else if (pid == 0) { 18 printf("This is child pid = %d.\n",getpid()); 19 //exec 20 char *buf[]={"/home/ying/experi-os/child","child",NULL};//b's path. 21 execve("/home/ying/experi-os/child",buf,NULL); 22 } 23 24 else { 25 printf("Hello world! Father pid is %d.\n",getpid()); 26 //Then wait the child(B) finished. 27 wait(NULL); 28 exit(0); 29 } 30 }
還有處理線程的child.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 #include <unistd.h> 5 6 int x = 0, sum = 0; 7 8 void *Sum(void* arg) { 9 //printf("sum begin successfully!\n"); 10 for (int i = 1; i <= x; i++) { 11 sum += i; 12 } 13 printf("\nThe result is %d\n", sum); 14 } 15 16 int main() 17 { 18 printf("exec success.\nInput x:"); 19 if (scanf("%d", &x) != 1) { 20 return 0; 21 } 22 23 pthread_t id; 24 pthread_create(&id, NULL, Sum, (void*)NULL); 25 pthread_join(id, NULL);//wait thread end 26 27 exit(0); 28 return 0; 29 }
而後對它們分別編譯
1 gcc child.c -o child -lpthread 2 gcc mian.c -o main
運行是
1 ./main
這個時候須要注意,對線程的編譯須要加上-lpthread,由於好像Linux默認庫裏沒有,不加會報錯
這樣就完成啦!
【BUG總結】
在寫的過程當中有幾回報錯
1.Sum函數報錯。Sum函數根據線程的形參要求應當是*Sum
2.main重複定義。兩個文件經過 execve指令鏈接,而非鏈接編譯
3.child.c編譯時線程報錯。緣由是沒有加上-lpthread
4.運行時bug。由於execve沒有指向正確的線程可執行文件
注意以上幾點基本上這個實驗就沒問題了,真的好簡單