作者laechan (小太保)
看板mud_sanc
标题[闲聊] C语言程式练习
时间Thu Aug 11 16:39:03 2011
我不用再逼自己练习了,我已经找上级谈过了。
底下附上我最近写的几支小程式
#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)