编程实现创建2个新进程,每个新进程负责打印出:
(1)“Hello!My father is+父进程号”
(2)“I am +子进程号”
(3)50以内的质数
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <stdarg.h> #include <sys/types.h> #include <sys/wait.h> #include <time.h> int prime[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}; int main(void) { printf("I'm your father,PID is %d. ",getpid()); pid_t pid = fork(); if(pid == 0) { printf("I'm a first son.PID is %d. ",getpid()); printf("Prime Numbers up to 50 :%d ",prime[rand()%15]); exit(1);//若此处没有exit(1), 进程也会执行 pid_t pid2 = fork()语句,会出现孙进程 } pid_t pid2 = fork(); if(pid2 == 0){ printf("I'm a second son.PID is %d. ",getpid()); printf("Prime Numbers up to 50 :%d ",prime[rand()%15]); exit(1); } else if(pid != -1||pid2!=-1) { printf("Parent forked child process--%d. ",pid); printf("Parent is waiting for child to exit. "); waitpid(pid,NULL,0); waitpid(pid2,NULL,0); printf("Child Process had exited. "); printf("Parent had exited. "); } else printf("Everything was done without error. "); return 0; }
编程实现创建3个新线程,每个新线程要求从主线程获得参数,并负责打印出:
(1)“Hello!My father is+父进程号”
(2)“I am +子进程号”
(3)判断参数是否为素数
#include <stdio.h> #include <stdlib.h> #include <pthread.h> //提供线程函数原型和数据结构的定义 #include <unistd.h> void thread(void *arg) { /*线程体函数*/ //pthread_detach(pthread_self());//子线程结束后,资源自动回收 sleep((int)arg); printf("I'm a son.TID is %lu.Father PID is %d. ",pthread_self(),getpid()); int i=2; for(i=2;i*i<(int)arg;++i) { if((int)arg%i==0) { printf("The Numbers %d is not a prime number. ",(int)arg); return NULL; } } printf("The Numbers %d is a prime number. ",(int)arg); return NULL; } int main() { printf("This is the main process PID:%d,TID: %lu. ",getpid(),pthread_self()); pthread_attr_t attr; //定义线程运行属性变量attr int i, ret; pthread_attr_init(&attr); //初始化线程运行属性变量attr pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);/*设置线程的分离状态*/ for(i=0;i<3;++i) { pthread_t pid; //定义线程标识符变量pid srand((unsigned int)time(0)); //printf("%d %d ",args.l,args.num); int lao=rand()%100; ret=pthread_create(&pid, &attr, (void *) thread, (void *)lao); /*创建一个新线程执行线程体函数thread(),该线程的标识符为pid*/ if(ret!=0) { //若创建新线程失败,则输出出错提示并退出程序 printf ("Create pthread error! "); exit (1); } } sleep(10); pthread_attr_destroy(&attr); //去初始化线程运行属性变量attr printf("This is the main process PID:%d exit~~~ ",getpid()); pthread_exit(NULL); return 0; //调用return()函数返回整型值0作为main()的返回值 }
客户端获得服务器时间,发送文件名可请求指定文件
客户端
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/socket.h> #include<arpa/inet.h> #include<netinet/in.h> #include<sys/types.h> #include<unistd.h> #include<time.h> #define BUFLEN 1024 char *SERVERIP="127.0.0.1"; int SERVER_PORT=23336; int my_BUFSIZ=4096; int FILE_NAME_MAX_SIZE=512; void binner() { printf(" 【多进程版·文件传输助手:Linux】 "); printf(" _ _ _ _ _ _ _ _ "); printf(" (_)(_)(_)(_) _ (_)_ _(_) (_)_ _(_) "); printf(" (_) (_) (_)_ _(_) (_)_ _(_) "); printf(" (_) _ _ _ (_) (_)_(_) (_)_(_) "); printf(" (_)(_)(_)(_) _(_)_ (_) "); printf(" (_) (_) _ _(_) (_)_ (_) "); printf(" (_) (_) _ _(_) (_)_ (_) "); printf(" (_) (_) (_) (_) (_) "); printf(" "); } void menue() { printf(" 使用说明: "); printf("-h:帮助 "); printf("-l:服务器地址,默认127.0.0.1 "); printf("-p:端口,默认23334 "); printf("-b:发送数据大小,默认4096 "); printf("-f:文件最大,默认512 "); } int main(int argc,char **argv) { binner(); menue(); if(argc>1) { if(strcmp(argv[1],"-h")==0) { exit(-1); } else { for(int i=1;i<argc;++i) { if(strcmp(argv[i],"-p")==0) { SERVER_PORT=atoi(argv[i+1]); } else if(strcmp(argv[i],"-b")==0) { my_BUFSIZ=atoi(argv[i+1]); } else if(strcmp(argv[i],"-l")==0) { SERVERIP = argv[i+1]; } else if(strcmp(argv[i],"-f")==0) { FILE_NAME_MAX_SIZE=atoi(argv[i+1]); } } } } printf("【TCP客户端:目标IP %s,监听端口 %d,发送数据大小:%d,发送文件名最大:%d】 ",SERVERIP,SERVER_PORT,my_BUFSIZ,FILE_NAME_MAX_SIZE); int tsock; tsock=socket(AF_INET,SOCK_STREAM,0); if(tsock<0) { printf("Create Socket Failed! "); exit(-1); } printf("Create Socket Success fully! "); struct sockaddr_in servaddr; memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family=AF_INET; inet_aton(SERVERIP,&servaddr.sin_addr); servaddr.sin_port=htons(SERVER_PORT); int ret; ret=connect(tsock,(struct sockaddr*)&servaddr,sizeof(struct sockaddr)); if(ret<0) { printf("Connect Failed! "); exit(-1); } //获取服务器的时间 socklen_t len; char buf[BUFLEN]; memset(buf, '