IO进程线程;进程,发送信号;进程,消息队列通信;0903
思维导图
父进程,非阻塞,回收子进程
代码
#include<myhead.h>
void handler(int signum)//函数 捕获信号后 ,怎么操作
{if(signum==SIGCHLD)//捕获到 SIGCHLD 回收子进程的资源{while(waitpid(-1,NULL,WNOHANG)>0);//循环 回收子进程的资源//回收任意子进程 非阻塞 }
}
int main()
{if(signal(SIGCHLD,handler)==SIG_ERR)//signal函数 捕获信号//默认 SIGCHLD会被忽略{perror("signal error");//上面的 signal函数会置位错误码 所以可以用perrorreturn -1;}while(1){if(fork()==0){exit(EXIT_SUCCESS);}}return 0;
}
运行情况
两个程序,从消息队列,发送接受数据
代码
msgrcv.c
#include<myhead.h>
//r.out 父进程接收,子进程发送
//自定义 消息结构体
struct msgbuf{long mtype;char mtext[1024];//消息正文大小 可自定义
};
#define SIZE (sizeof(struct msgbuf)-sizeof(long))int main()
{//创建key值 要一样才行key_t key=ftok("/",'x');if(key==-1)//判断 key值创建成功{perror("ftok error");return -1;}//打开 同一个消息列表int Messageid=msgget(key,IPC_CREAT);if(Messageid==-1)//判断 创建消息队列成功{perror("msgget error");return -1;}//定义 发送的数据的 结构体变量struct msgbuf buff;//创建多进程int pid=fork();//父进程 接收消息 类型1if(pid>0){while(1){//默认 接收类型1//接收内容msgrcv(Messageid,&buff,SIZE,1,0);//阻塞形式接收printf("%s\n",buff.mtext);}}//子进程 发送消息 类型2else if(pid==0){while(1){//默认 发送类型2buff.mtype=2;//发送内容fgets(buff.mtext,SIZE,stdin);//fgets 从终端接收 SIZE字节 >保存到buff.mtextbuff.mtext[strlen(buff.mtext)-1]='\0';//把 数据正文的末尾 置'\0'//发送数据msgsnd(Messageid,&buff,SIZE,0);//以阻塞的形式发送,但是这个程序应该不会遇到阻塞的情况,因为另一个程序会把写进消息队列的马上读出来}}return 0;
}
msgsnd.c
#include<myhead.h>
//s.out 父进程发送,子进程接收//自定义 消息结构体
struct msgbuf{long mtype;char mtext[1024];//消息正文大小 可自定义
};
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main()
{//创建 key值key_t key=ftok("/",'x');if(key==-1)//判断 key值创建成功{perror("ftok error");return -1;}//创建 消息队列int Messageid=msgget(key,IPC_CREAT|0644);if(Messageid==-1)//判断 创建消息队列成功{perror("msgget error");return -1;}//定义 发送的数据的 结构体变量struct msgbuf buff;//创建 多进程int pid=fork();//父进程 发送消息 类型1if(pid>0){while(1){//默认 发送类型1buff.mtype=1;//发送内容fgets(buff.mtext,SIZE,stdin);//fgets 从终端接收 SIZE字节 保存到buff.mtextbuff.mtext[strlen(buff.mtext)-1]='\0';//把 数据正文的末尾 置'\0'//发送数据msgsnd(Messageid,&buff,SIZE,0);//以阻塞的形式发送,但是这个程序应该不会遇到阻塞的情况,因为另一个程序会把写进消息队列的马上读出来}}//子进程 接收消息 类型2else if(pid==0){while(1){//默认 接收类型2//接收内容msgrcv(Messageid,&buff,SIZE,2,0);//阻塞形式接收printf("%s\n",buff.mtext);}}return 0;
}
运行情况
牛客刷题