mud_sanc 板


LINE

我不用再逼自己练习了,我已经找上级谈过了。 底下附上我最近写的几支小程式 #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
1F:→ laechan :其实我有做出来了, 但是也到此为止了 08/11 17:00
※ 编辑: laechan 来自: 101.13.136.121 (08/11 17:39)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP