上一篇博客感觉上就像一篇流水帐,就连本人都不知道自己在写些什么,所以,这篇博客将用三个实例说明linux进程和线程编程。
1、实验一:创建进程
说明:由父进程创建子进程,让子进程读取一个文件,父进程等待子进程读完文件后继续执行
解决方案:用waitpid()函数协调两个进程。
源码:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
void rawF(char *fileName){
FILE* fp = fopen(fileName, "r");
if(fp == NULL){
printf("Error!\n");
exit(1);
}else{
char c;
while((c = getc(fp)) != EOF){
putc(c, stdout);
}
}
}
int main(){
/*创建子进程*/
int p_id = fork();
if(p_id == -1){/*创建失败*/
printf("创建子进程失败");
exit(-1);
}
else if(p_id == 0){/*子进程*/
printf("This is child process with pid of %d\n", getpid());
/*读取一个文件并打印屏幕*/
rawF("test.txt");
}
else{/*父进程*/
pid_t p = wait(NULL);/*等待子进程结束*/
printf("child process with pid %d is over.\n", p);
}
}
2、实验二:线程共享进程中的数据
说明:创建一个线程,在线程中更改进程中的数据
解决方案:在进程中定义共享数据,在线程中直接引用并输出该数据
源码:
#include<stdio.h>
#include<pthread.h>
static int sharedata = 4;
void *create(void* arg){
printf("new thread...\n");
printf("shared data = %d\n", sharedata);
sharedata = 8;
return (void*)0;
}
int main(){
/*用thread_create()创建新进程*/
pthread_t tidp;
int error = pthread_create(&tidp, NULL, create, NULL);
if(error != 0){//创建失败
printf("pthread_create is not create ...");
return -1;
}
sleep(1);/*等待一段时间*/
printf("pthread_create is create...\n");
printf("shared data = %d\n", sharedata);
return 0;
}
注意:编译选项为gcc -Wall -lpthread a.c,因为pthread库不是Linux系统的库。
3、多线程单词统计
说明:两个文件,两个线程,统计两个文件共有多少单词
解决方案:利用互斥锁修改临界资源,确保线程间的同步与协作
源码:
#include<stdio.h>
#include<pthread.h>
#include<pthread.h>
pthread_mutex_t counter = PTHREAD_MUTEX_INITIALIZER;
int total_words = 0;
void *count_words(void *f){
char* filename = (char*)f;
FILE* fp;
int c, prevc = '\0';
if((fp = fopen(filename, "r")) != NULL){
while((c = getc(fp)) != EOF){
if(!isalnum(c) && isalnum(prevc)){
pthread_mutex_lock(&counter);
total_words++;
pthread_mutex_unlock(&counter);
}
prevc = c;
}
fclose(fp);
}else{
printf("ERROR!");
}
return 0;
}
int main(int argc, char** argv){
if(argc != 3){
printf("Usage:%s file1 file2\n", argv[0]);
exit(1);
}
/*以argv[1]和argv[2]作为参数,创建两个线程*/
pthread_t tidp1, tidp2;
int error1, error2;
error1 = pthread_create(&tidp1, NULL, count_words, argv[1]);
error2 = pthread_create(&tidp2, NULL, count_words, argv[2]);
if((error1 != 0) || (error2 != 0)){
printf("ERROR!\n");
return -1;
}
/*等待两个线程结束*/
void* temp1, *temp2;
error1 = pthread_join(tidp1, &temp1);
error2 = pthread_join(tidp2, &temp2);
if((error1 != 0) || (error2 != 0)){
printf("ERROR!\n");
return -1;
}
printf("%d, %d\n", (int)temp1, (int)temp2);
/*输出统计出来的单词总数*/
printf("The total words of two files is %d\n", total_words);
}
后记:
进程和线程编程博大精深,不是很明白,但是目前我的追求是先要广度,再要深度,所以就这样吧,明天继续看进程通信!