[閒聊] C語言程式練習

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間14年前 (2011/08/11 16:39), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串1/3 (看更多)
我不用再逼自己練習了,我已經找上級談過了。 底下附上我最近寫的幾支小程式 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> // 線程 int test_pthread(*void ii); void main(int argc,char *argv[]) // 讓指令可接參數用 { FILE *fp; char str[100],str2[]="test."; int i=0,a,b; pthread_t th; if((fp=tmpfile())!=NULL) // 可開啟暫存檔的話 { printf("hello world!\n"); // 先在螢幕秀出訊息 fflush(fp); // 馬上將 buff(即剛秀出的東西) 寫入 fp fseek(fp,0,SEEK_SET); // 將檔案讀寫頭挪到檔頭 fscanf(fp,"%s",str); printf("剛剛寫入的訊息是: %s\n",str); // 測試能否從檔案讀到剛剛寫入的訊息 fclose(fp); } printf("請輸入訊息: "); scanf("%s",str); if(strcmp(str,str2)==0) // 字串比較函數, return 0 代表相等 printf("你輸入的訊息與 str2 相等.\n"); else { printf("你輸入的訊息 %s 與 str2(%s) 不相等.\n",str,str2); strcpy(str2,str); // 將 str2 取代為輸入的訊息 str } while(argv[i]) i++; // argv[0] = 指令本身, 如 ./a.out // argv[1] = 指令後面所接的第一個參數, 如 -v, [2][3]以此類推, 最多到[3] printf("你的指令後面接了 %d 個參數.\n",&i); if(argv[1] && strcmp(argv[1],"-v")==0 && argv[2]) // 第一個參數是 -v 時 { if(sscanf(argv[2],"%d-%d",&a,&b)==2) printf("轉換後的指令是: %s %s %d-%d\n", argv[0],argv[1],a,b); else if((a=atoi(argv[2]))>0) // 格式不是 a-b, 那就強制轉換整數再計算 { b=a; printf("轉換後的指令是: %s %s %d-%d\n", // 即輸入單值時就改成 a-a argv[0],argv[1],a,b); } else printf("你輸入的數值範圍不合法喔. } system("ls -l > file.txt"); // 把 ls -l 的結果存進 file.txt 檔 fp=fopen("file.txt","r"); // 以唯讀狀態開啟 file.txt while(!feof(fp)) // 檔案讀寫頭還沒讀到檔案尾端時 { fgets(str,100,fp); // 從檔案讀取一行, 讀寫頭這時會跳到下一行行頭 printf("%s",str); // 測試讀出來的東西是不是一行一行分隔(連\n都讀) } fclose(fp); // 讀完關檔 fp=popen("ls -l","r"); // 測試 popen, ls-l 的結果直接用 fp 指向 while(fgets(line,100,fp)!=NULL) // 逐行讀取 fp printf("%s",line); // 列出每一行 pclose(fp); // 讀完關檔 // 測試線程 for(i=1;i<=10;i++) if(pthread_create(&th,NULL,(void *)test_pthread,(void *)&i)==0) printf("線程 %d 呼叫了!\n",i); // 創造一個線程呼叫, 參數1: &th(與宣告 pthread_t th 那裡對映) // 參數2: NULL 我是照用 參數3: (void *)呼叫的函數名 // 參數4: 我想把 i 傳過去, (void *)&i 與 test_pthread(void* ii) 對映 // 上面的執行結果是會先一次執行 10 行 printf, 代表 10 個線程 // 都在一瞬間呼叫成立 // 底下這行, 最阻止程式馬上進入底下的 return 1 // 它會等到本函數所 create 的所有線程都做完它該做的工作後 // 才會讓底下的 if 成立→printf→return 1; if(pthread_join(th,&a)==0) printf("所有的線程都執行完畢了.\n"); return 1; } int test_pthread(void* ii) { int nt=*((int *)ii); // 這一行也是照抄的, 把 ii 轉成正常整數 nt sleep(nt); // sleep nt 秒 system("date"); // 然後才執行 date 指令 return 1; } 上面線程測試的意思是,它一次建立 10 個呼叫 test_pthread 的線程,這時 10 個 test_pthread 函數就會同時動作,於是.. 00:00:xx 先做 10 個 printf("線程 %d 呼叫了!\n",i); <= 瞬間完成 00:01:00 做第一個 date 指令(因為它 sleep 了 1 秒) 00:02:00 做第二個 date 指令(因為它 sleep 了 2 秒) . . . 00:10:00 做第10個 date 指令 之後我的問題就卡在我無法將上面的線程做分段,例如說 我要做 100 次的 system("date"); ,但是我怕它會對系 統造成負擔,我希望它分段做,每次做 10 個,然後間隔 1 秒後再做 10 個,上面的改法是.. b=i/10; // 先看要分幾段 while(b-->0) { for(i=1;i<=10;i++) if(pthread_create(&th,NULL,(void *)test_pthread,(void *)&i)==0) printf("線程 %d 呼叫了!\n",i); } 然後 test_pthread 裡面再做 pthread_create 建立 10 個呼叫另一函數的線程,... 我練做到這裡頭腦就快爆炸了。 Laechan -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 101.13.136.121

08/11 17:00, , 1F
其實我有做出來了, 但是也到此為止了
08/11 17:00, 1F
※ 編輯: laechan 來自: 101.13.136.121 (08/11 17:39)
文章代碼(AID): #1EGvKict (mud_sanc)
文章代碼(AID): #1EGvKict (mud_sanc)