[閒聊] C語言程式練習
看板mud_sanc (Sanctuary - 聖殿)作者laechan (小太保)時間14年前 (2011/08/11 16:39)推噓0(0推 0噓 1→)留言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)
討論串 (同標題文章)
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
-9
35
15
23