進程與線程簡單實驗

【實驗要求】: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沒有指向正確的線程可執行文件

注意以上幾點基本上這個實驗就沒問題了,真的好簡單

相關文章
相關標籤/搜索