#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/wait.h>#include<string.h>// ./a.out 1 2 3 4intmain(int argc,char**argv){while(1){char path[512]={0};getcwd(path,sizeof(path));printf("[linux@ubuntu:%s]",path);fflush(stdout);char cmd[256]={0};fgets(cmd,sizeof(cmd),stdin);cmd[strlen(cmd)-1]='\0';char*args[5]={NULL};args[0]=strtok(cmd," ");args[1]=strtok(NULL," ");args[2]=strtok(NULL," ");// if cd if(0==strcmp(args[0],"cd")){if(NULL== args[1]){chdir("/home/linux");}else{chdir(args[1]);}}pid_t pid =fork();if(pid>0){wait(NULL);}elseif(0== pid){// ls -alhF ll ll 1.cif(0==strcmp(args[0],"ll")){args[0]="ls";if(NULL== args[1]){args[1]="-alhF";}else{args[2]="-alhF";}}execvp(args[0], args);exit(1);}}return0;}
thread
pthread_self
#include<stdio.h>#include<unistd.h>#include<pthread.h>void*th1(void*arg){while(1){printf("接受控制 tid %lu\n",pthread_self());sleep(1);}returnNULL;}void*th2(void*arg){while(1){printf("发送视频 tid %lu\n",pthread_self());sleep(1);}returnNULL;}intmain(int argc,char**argv){pthread_t tid1,tid2;pthread_create(&tid1,NULL,th1,NULL);pthread_create(&tid2,NULL,th2,NULL);while(1){printf("main_th tid %lu\n",pthread_self());sleep(1);}return0;}
#include<stdio.h>#include<unistd.h>#include<pthread.h>void*th(void* arg){while(1){printf("th1 ,tid %lu\n",pthread_self());sleep(1);}pthread_exit(NULL);// exit}intmain(int argc,char**argv){pthread_t tid;pthread_create(&tid,NULL,th,NULL);int i =0;while(1){i++;sleep(1);if(i>=10){pthread_cancel(tid);}}return0;}
pthread_limit
#include<stdio.h>#include<unistd.h>#include<pthread.h>void*th(void* arg){pthread_exit(NULL);// exit}intmain(int argc,char**argv){pthread_t tid;int i =0;for(i=0;i<50000;i++){int ret =pthread_create(&tid,NULL,th,NULL);if(0!=ret){printf("num %d\n",i);break;}}return0;}
pthread_join
#include<stdio.h>#include<unistd.h>#include<pthread.h>void*th(void* arg){pthread_exit(NULL);// exit}intmain(int argc,char**argv){pthread_t tid;int i =0;for(i=0;i<50000;i++){int ret =pthread_create(&tid,NULL,th,NULL);if(0!=ret){break;}pthread_join(tid,NULL);}printf("num %d\n",i);return0;}
#include<stdio.h>#include<unistd.h>#include<pthread.h>void*th(void* arg){pthread_detach(pthread_self());pthread_exit(NULL);// exit}intmain(int argc,char**argv){pthread_t tid;int i =0;for(i=0;i<50000;i++){int ret =pthread_create(&tid,NULL,th,NULL);if(0!=ret){break;}}printf("num %d\n",i);return0;}
#include<pthread.h>#include<stdio.h>#include<stdlib.h>int a =0;void*th(void* arg){int i =5000;while(i--){int tmp = a;printf("a is %d\n",tmp+1);a = tmp+1;}returnNULL;}intmain(int argc,char**argv){pthread_t tid1,tid2;pthread_create(&tid1,NULL,th,NULL);pthread_create(&tid2,NULL,th,NULL);pthread_join(tid1,NULL);pthread_join(tid2,NULL);return0;}
pthread_mutex
#include<pthread.h>#include<stdio.h>#include<stdlib.h>int a =0;pthread_mutex_t mutex ;void*th(void* arg){int i =5000;while(i--){pthread_mutex_lock(&mutex);int tmp = a;printf("a is %d\n",tmp+1);a = tmp+1;pthread_mutex_unlock(&mutex);}returnNULL;}intmain(int argc,char**argv){pthread_t tid1,tid2;pthread_mutex_init(&mutex,NULL);pthread_create(&tid1,NULL,th,NULL);pthread_create(&tid2,NULL,th,NULL);pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_mutex_destroy(&mutex);return0;}
pthread_trylock
#include<pthread.h>#include<stdio.h>#include<stdlib.h>int a =0;pthread_mutex_t mutex;void*th(void*arg){int i =5000;while(i--){while(1){int ret =pthread_mutex_trylock(&mutex);if(0== ret){int tmp = a;printf("a is %d\n", tmp +1);a = tmp +1;pthread_mutex_unlock(&mutex);break;}else{printf("锁被其他线程占用,申请失败,稍后在试\n");}}}returnNULL;}intmain(int argc,char**argv){pthread_t tid1, tid2;pthread_mutex_init(&mutex,NULL);pthread_create(&tid1,NULL, th,NULL);pthread_create(&tid2,NULL, th,NULL);pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_mutex_destroy(&mutex);return0;}
bank
#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>int WIN =3;pthread_mutex_t mutex;void*th(void*arg){while(1){pthread_mutex_lock(&mutex);if(WIN >0){WIN--;pthread_mutex_unlock(&mutex);printf("get win %lu\n",pthread_self());sleep(rand()%5+1);printf("releset win %lu\n",pthread_self());pthread_mutex_lock(&mutex);WIN++;pthread_mutex_unlock(&mutex);break;}else{pthread_mutex_unlock(&mutex);}}returnNULL;}intmain(int argc,char**argv){pthread_t tid[10]={0};pthread_mutex_init(&mutex,NULL);int i =0;for(i =0; i <10; i++){pthread_create(&tid[i],NULL, th,NULL);}for(i =0; i <10; i++){pthread_join(tid[i],NULL);}pthread_mutex_destroy(&mutex);return0;}
bank_nonblock
#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>int WIN =3;pthread_mutex_t mutex_win1;pthread_mutex_t mutex_win2;pthread_mutex_t mutex_win3;voiddo_bank(){printf("get win %lu\n",pthread_self());sleep(rand()%5+1);printf("releset win %lu\n",pthread_self());}void*th(void*arg){int ret =0;while(1){ret =pthread_mutex_trylock(&mutex_win1);if(0== ret){do_bank();pthread_mutex_unlock(&mutex_win1);break;}ret =pthread_mutex_trylock(&mutex_win2);if(0== ret){do_bank();pthread_mutex_unlock(&mutex_win2);break;}ret =pthread_mutex_trylock(&mutex_win3);if(0== ret){do_bank();pthread_mutex_unlock(&mutex_win3);break;}}returnNULL;}intmain(int argc,char**argv){pthread_t tid[10]={0};pthread_mutex_init(&mutex_win1,NULL);pthread_mutex_init(&mutex_win2,NULL);pthread_mutex_init(&mutex_win3,NULL);int i =0;for(i =0; i <10; i++){pthread_create(&tid[i],NULL, th,NULL);}for(i =0; i <10; i++){pthread_join(tid[i],NULL);}pthread_mutex_destroy(&mutex_win1);pthread_mutex_destroy(&mutex_win2);pthread_mutex_destroy(&mutex_win3);return0;}
sem
#include<pthread.h>#include<semaphore.h>#include<stdio.h>#include<unistd.h>sem_t sem_H, sem_W;void*th1(void*arg){int i =10;while(i--){sem_wait(&sem_H);// P -1printf("hello,");fflush(stdout);sem_post(&sem_W);// V +1}returnNULL;}void*th2(void*arg){int i =10;while(i--){sem_wait(&sem_W);printf(" world\n");sem_post(&sem_H);sleep(1);}returnNULL;}intmain(int argc,char**argv){pthread_t tid1, tid2;sem_init(&sem_H,0,1);sem_init(&sem_W,0,0);pthread_create(&tid1,NULL, th1,NULL);pthread_create(&tid2,NULL, th2,NULL);pthread_join(tid1,NULL);pthread_join(tid2,NULL);sem_destroy(&sem_H);sem_destroy(&sem_W);return0;}
bank_sem
#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<semaphore.h>//pthread_mutex_t mutex;sem_t sem_WIN;void*th(void*arg){sem_wait(&sem_WIN);printf("get win %lu\n",pthread_self());sleep(rand()%5+1);printf("releset win %lu\n",pthread_self());sem_post(&sem_WIN);returnNULL;}intmain(int argc,char**argv){pthread_t tid[10]={0};//pthread_mutex_init(&mutex, NULL);sem_init(&sem_WIN,0,3);int i =0;for(i =0; i <10; i++){pthread_create(&tid[i],NULL, th,NULL);}for(i =0; i <10; i++){pthread_join(tid[i],NULL);}//pthread_mutex_destroy(&mutex);sem_destroy(&sem_WIN);return0;}
system for shared memory
#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<semaphore.h>pthread_mutex_t mutex;sem_t sem_MEM;int MEM[3]={0};intget_mem(){int ret =-1;sem_wait(&sem_MEM);int i =0;pthread_mutex_lock(&mutex);for(i =0;i<3;i++){if(0== MEM[i]){MEM[i]=1;//return i;ret = i;break;}}pthread_mutex_unlock(&mutex);return ret;}intrelese_mem(int id){MEM[id]=0;sem_post(&sem_MEM);}void*th(void*arg){int id =get_mem();printf("tid:%lu get memid %d\n",pthread_self(),id);sleep(rand()%5+1);relese_mem(id);printf("tid:%lu relese memid %d\n",pthread_self(),id);returnNULL;}intmain(int argc,char**argv){pthread_t tid[10]={0};pthread_mutex_init(&mutex,NULL);sem_init(&sem_MEM,0,3);int i =0;for(i =0; i <10; i++){pthread_create(&tid[i],NULL, th,NULL);}for(i =0; i <10; i++){pthread_join(tid[i],NULL);}pthread_mutex_destroy(&mutex);sem_destroy(&sem_MEM);return0;}
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>intmain(int argc,char**argv){int pipefd[2]={0};int ret =pipe(pipefd);pid_t pid =fork();if(pid>0){close(pipefd[0]);char buf[]="hello,this is pipe test";sleep(3);write(pipefd[1],buf,strlen(buf));exit(0);}elseif(0== pid){close(pipefd[1]);char buf[256]={0};read(pipefd[0],buf,sizeof(buf));printf("pipe %s\n",buf);}else{perror("fork");exit(1);}return0;}
pipe_write_block
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>intmain(int argc,char**argv){int pipefd[2]={0};int ret =pipe(pipefd);pid_t pid =fork();if(pid>0){close(pipefd[0]);char buf[1024]={0};memset(buf,'a',sizeof(buf));int i =0;for(i=0;i<65;i++){write(pipefd[1],buf,sizeof(buf));printf("i is %d\n",i);}exit(0);}elseif(0== pid){close(pipefd[1]);sleep(3);char buf[4096]={0};read(pipefd[0],buf,sizeof(buf));sleep(1);printf("pipe %s\n",buf);}else{perror("fork");exit(1);}return0;}
pipe_write_broken.c
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>intmain(int argc,char**argv){int pipefd[2]={0};int ret =pipe(pipefd);pid_t pid =fork();if(pid>0){sleep(1);close(pipefd[0]);char buf[]="hello,this is pipe test";write(pipefd[1],buf,strlen(buf));//需要gdb才能观测到printf("after write\n");exit(0);}elseif(0== pid){close(pipefd[1]);close(pipefd[0]);sleep(10);}else{perror("fork");exit(1);}return0;}
fifo
fifo_read
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<string.h>#include<errno.h>intmain(int argc,char*argv[]){int ret =mkfifo("myfifo",0666);if(-1== ret){if(EEXIST==errno ){}else{perror("mkfifo");return1;}}int fd =open("myfifo",O_RDONLY);if(-1== fd){perror("open");return1;}char buf[128]={0};read(fd,buf,sizeof(buf));printf("fifo:%s\n",buf);close(fd);//remove("myfifo");return0;}
fifo_write
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<string.h>#include<errno.h>intmain(int argc,char*argv[]){int ret =mkfifo("myfifo",0666);if(-1== ret){if(EEXIST==errno ){}else{perror("mkfifo");return1;}}int fd =open("myfifo",O_WRONLY);if(-1== fd){perror("open");return1;}char buf[]="hello ,this is fifo test";write(fd,buf,strlen(buf));close(fd);return0;}
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<signal.h>int flag =0;voidmyhanle(int num){flag =1;}intmain(int argc,char**argv){signal(SIGALRM,myhanle);alarm(5);while(1){if(0== flag){printf("i'm sleep\n");}else{printf("i'm working\n");}sleep(1);}return0;}
signal_continue
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<signal.h>voidmyhandle(int num){}intmain(int argc,char**argv){signal(SIGCONT,myhandle);int i =0;while(1){printf("i'm sleep %d\n",getpid());sleep(1);i++;if(5==i){pause();}}return0;}
signal_child
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<signal.h>#include<wait.h>voidmyhandle(int num){pid_t pid =wait(NULL);printf("recycle pid %d\n",pid);}intmain(int argc,char*argv[]){signal(SIGCHLD,myhandle);pid_t ret =fork();if(ret>0){int i =10;while(i--){printf("发视频,father\n");sleep(1);}}elseif(0== ret){int i =5;while(i--){printf("接受控制 child pid:%d\n",getpid());sleep(1);}}else{perror("fork");return1;}return0;}
signal_user
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<signal.h>voidmyhandle1(int num){staticint i =0;printf("老爸,叫你帮忙\n");i++;if(i>=3){signal(SIGUSR1,SIG_IGN);}}voidmyhandle2(int num){staticint i =0;printf("老妈,叫你帮忙\n");i++;if(i>=3){signal(SIGUSR2,SIG_DFL);}}intmain(int argc,char**argv){signal(SIGUSR1,myhandle1);signal(SIGUSR2,myhandle2);while(1){printf("i'm play... %d\n",getpid());sleep(1);}return0;}
一、问题描述
在一个整数数组 nums 中,需要找出第 k 个最大的元素。这里要注意,我们要找的是数组排序后的第 k 个最大元素,而不是第 k 个不同的元素。例如,对于数组 [3,2,1,5,6,4],当 k 2 时,第 2 个最大…