Linux下C语言多进程编程实例(用C语言模拟word软件,一边输入,一边统计字符)

作者: 极客头条  更新时间:2016-01-24 15:14:20  原文链接


下面通过两个实例来讲解多进程编程。

1. 首先先举一个简单的多进程程序吧,让大家好理解多进程编程。

代码如下:

#include<pthread.h>
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void *mythread(void *arg)
{
	int v=*(int *)arg;
	printf("v= %d\n",v);

	while(1)
	{
		printf("my thread\n");
		sleep(2);
	}

}


int main(int argc,char* argv[])
{
	int i=5;
	pthread_t tid;

	pthread_create(&tid,NULL,mythread,&i);
	
	while(1)
	{
		printf("main thread\n");
		sleep(1);
	}

	return 0;
}

编译:在终端中输入:gcc test.c -lpthread。

运行:在终端中输入:./a.out

效果如下:

2. 下面写一个动态统计字数的程序。

程序功能: 模拟word软件,用户可以从键盘输入字符,敲下回车,程序动态的统计字符个数。

程序代码如下:

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<string.h>
char text[4096]={0};
int flag=0;


void *mythread(void *arg)
{
	int v=*(int *)arg;

	while(1)
	{
		if(flag==1)
		{
			printf("current length of text is : %d\n ",strlen(text));
			flag=0;
		}
		usleep(10000);
	}
}


int main(int argc,char* argv[])
{
	int i=5;
	pthread_t tid;
	char buf[128];

	pthread_create(&tid,NULL,mythread,&i);
	
	while(1)
	{
		memset(buf,0,sizeof(buf));
		gets(buf);
		strcat(text,buf);
		flag=1;		
	}

	return 0;
}

//gcc test.c -lpthread


4.网络程序的开发,Linux下的。
c/s架构。
时间回送。客户机请求,服务器发回时间,客户机进行同步。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

void client_process(int connfd);

int main(int argc, char *argv[])
{
	int ret;
	int listenfd;
	int connfd;
	struct sockaddr_in srvaddr;
	struct sockaddr_in cliaddr;
	socklen_t addrlen;

	listenfd = socket(AF_INET, SOCK_STREAM, 0);
	if (listenfd == -1) {
		perror("socket");
		exit(EXIT_FAILURE);
	}

	srvaddr.sin_family = AF_INET;
	srvaddr.sin_port = htons(8888);
	srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	ret = bind(listenfd, (struct sockaddr *)&srvaddr, sizeof(srvaddr));
	if (ret == -1) {
		perror("bind");
		exit(EXIT_FAILURE);
	}

	ret = listen(listenfd, 5);
	if (ret == -1) {
		perror("listen");
		exit(EXIT_FAILURE);
	}

	while (1) {
		memset(&cliaddr, 0, sizeof(cliaddr));
		addrlen = sizeof(cliaddr);
		connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &addrlen);
		if (connfd != -1) {
			printf("a new client is comming\n");
			client_process(connfd);
			printf("disconnect\n");
			close(connfd);
		} else
			perror("accept");
	}

	close(listenfd);
}

void client_process(int connfd)
{
	int ret;
	char buf[4096];

	while (1) {
		memset(buf, 0, sizeof(buf));
		strcpy(buf, "Kevin@TimeServer $ ");
		ret = write(connfd, buf, strlen(buf) + 1);
		if (ret == -1) {
			perror("write");
			return;
		}

		memset(buf, 0, sizeof(buf));
		ret = read(connfd, buf, sizeof(buf));
		if (ret > 0) {
			if (strcmp(buf, "time\r\n") == 0) {
				time_t t;

				memset(buf, 0, sizeof(buf));
				strcpy(buf, "Kevin@TimeServer $ ");
				ret = write(connfd, buf, strlen(buf) + 1);
				if (ret == -1) {
					perror("write");
					return;
				}

				time(&t);
				strcpy(buf, ctime(&t));

				ret = write(connfd, buf, strlen(buf) + 1);
				if (ret == -1) {
					perror("write");
					return;
				}
			}
		} else if (ret == -1) {
			perror("read");
			return;
		} else
			return;
	}
}

编译运行方法同上。

下面给出运行截图:

注:博主使用的是Ubuntu操作系统,程序都通过了编译执行。