学习国嵌实验手册

来源:互联网 发布:美图秀秀 mac版本 编辑:程序博客网 时间:2024/05/07 00:51
///////////////////////////////////void *thread(void *str);    pthread_t pth;/*创建线程并执行线程执行函数*/    int ret = pthread_create(&pth, NULL, thread, NULL);    pthread_t pthread_self();//得到线程id/*线程处理函数pthread_cleanup_push / pthread_cleanup_pop线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。pthread_cleanup_push来注册清理函数rtn,这个函数有一个参数arg。在以下三种情形之一发生时,注册的清理函数被执行:    1)调用pthread_exit。    2)作为对取消线程请求(pthread_cancel)的响应。    3)以非0参数调用pthread_cleanup_pop。注意:    1)如果线程只是由于简单的返回而终止的,则清除函数不会被调用。2)如果pthread_cleanup_pop被传递0参数,则清除函数不会被调用,但是会清除处于栈顶的清理函数。*/#include <pthread.h>sem_t s1;    sem_init (&thiz->s1, 0, 1);//初始化信号量,值为1.    sem_destroy (&thiz->s1);    sem_wait (&thiz->s2);    sem_post (&thiz->s1);pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_mutex_lock(&mutex);pthread_mutex_unlock(&mutex);///////////////////////////////////////////////*调用execl函数,用可执行程序file_creat替换本进程*/if(execl("./file_creat","file_creat",argv[1],NULL)<0)perror("execl error!");////////////////////////////////////////////sleep(1);  //gcc库,使进程休眠,sleep()函数是以秒为单位的,sleep(1);就是休眠1秒。void usleep(unsigned long usec); //使线程休眠函数,微妙为单位休眠,#include <system.h>。delay(unsigned int msec);//如果想延时一秒钟的话,可以用delay(250);//无名管道 int pipe_fd[2];pipe(pipe_fd);/*创建管道*/if((pid=fork())==0)  //子进程执行序列{close(pipe_fd[1]);//子进程先关闭了管道的写端r_num=read(pipe_fd[0],buf_r,100);close(pipe_fd[0]);}else if(pid>0) //父进程执行序列{close(pipe_fd[0]); //父进程先关闭了管道的读端write(pipe_fd[1],"Hello",5);close(pipe_fd[1]);}//有名管道写,创建mkfifo("/tmp/myfifo",O_CREAT|O_EXCL|O_RDWR);  /*创建有名管道*/int fd=open("/tmp/myfifo",O_RDWR|O_NONBLOCK,0);write(fd,w_buf,100)/* 向管道写入数据 */close(fd); //关闭管道//有名管道读fd=open("/tmp/myfifo",O_RDONLY|O_NONBLOCK,0);/* 打开管道 */read(fd,buf_r,100);close(fd); //关闭管道unlink("/tmp/myfifo"); //删除文件/*注册信号处理函数*/signal(SIGBUS,my_func);.../*自定义信号处理函数*/void my_func(int sign_no){if(sign_no==SIGBUS)printf("I have get SIGBUS\n");}///////////////////////////////////\/*创建消息队列*/msgid=msgget((key_t)1234,0666 | IPC_CREAT);    /*读取消息*/    msgrcv(msgid,(void *)&some_data,BUFSIZ,msg_to_receive,0);/*添加消息*/msgsnd(msgid,(void *)&some_data,MAX_TEXT,0)/*从系统内核中移走消息队列*/msgctl(msgid,IPC_RMID,0);
char cwd_buf[80];getcwd(cwd_buf,sizeof(cwd_buf));/* 获取当前目录 */ DIR *dir = opendir(cwd_buf);while((ptr = readdir(dir)) != NULL){/* 遍历整个目录 */if((ptr->d_type == 8) && (p=strstr(ptr->d_name,".mp3")) != NULL){/*查找后缀名为mp3的普通文件  */strcpy(name[i++],ptr->d_name);}}int memory_id;memory_id = shmget(IPC_PRIVATE, sizeof(struct share), IPC_CREAT|0666))shmadd = shmat(memory_id, (void *)0, 0)//这就是获得这个id的共享内存地址/* 父进程中使用共享内存,获取孙子进程中记录的进程ID */while(1){node_tmp = node_tmp->next;//切换到下一首歌if(fork() == 0){shmadd = shmat(memory_id, (void *)0, 0);/* 映射共享内存 */share_para = (struct share *)shmadd;share_para->id_tmp = getpid();/* 将ID存入共享内存 */if(execlp("madplay","madplay",node_tmp->s_name,NULL)<0)perror("execlp ");}elsewait(NULL);//父进程阻塞直到子进程死掉}share_tmp = (struct share *)shmadd;kill(share_tmp->id_tmp, SIGSTOP);//pausekill(share_tmp->id_tmp,SIGCONT); //continue


                                             
0 0
原创粉丝点击