1.无名管道
无名管道主要是通过pipe创建管道,再用fork创建进程。
#include<stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
int fd[2]={0};
int pid;
char buffer[128];
// int pipe(int pipefd[2]);
if(pipe(fd)==-1){
printf("creat pipe fail!\n");
}
pid = fork();
if(pid<0){
printf("creat child fail\n");
}
else if(pid>0){
sleep(3);
printf("this is father\n");
close(fd[0]);
write(fd[1],"hello from father",strlen("hello from father"));
wait(NULL);
}else{
printf("this is child\n");
close(fd[1]);
read(fd[0],buffer,128);
printf("read from fathe:%s\n",buffer);
exit(0);
}
return 0;
}
2.有名管道
使用fifo函数
读:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
int n_read=0;
char buf[30]={0};
//int mkfifo(const char *pathname, mode_t mode);
if(mkfifo("./fifo",0600) == -1 && errno != EEXIST){//创建FIFO管道
printf("mkfifo failed!\n");
perror("why");
}
int fd = open("./file",O_RDONLY);
printf("open success\n");
while(1){
n_read = read(fd,buf,30);
// while(!n_read);
if(n_read){
printf("read %d by from fifo, contection:%s\n",n_read,buf);
}
}
close(fd);
return 0;
}
写:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
int cnt =0;
char *str="message from fifo ";
//int mkfifo(const char *pathname, mode_t mode);
int fd = open("./file",O_WRONLY);
printf("write open success\n");
while(1){
write(fd,str,strlen(str));
sleep(1);
cnt++;
if(cnt==5){
break;
}
}
close(fd);
return 0;
}
3.消息队列
使用msgsend msgsend等函数
发送:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
struct msgbuf{
long mtype;
char mtext[128];
};
int main()
{
//huoqu
// int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
// ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
// int msgget(key_t key, int msgflg);
struct msgbuf sendbuf = {888,"this is message from queue"};
struct msgbuf readbuf;
int msgid = msgget(0x1234,IPC_CREAT|0777);
if(msgid==-1){
printf("get queue fail\n");
}
msgsnd(msgid,&sendbuf,strlen(sendbuf.mtext),0);
msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),988,0);
printf("return from get:%s\n",readbuf.mtext);
return 0;
}
接收:
#include<stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<string.h>
struct msgbuf{
long mtype;
char mtext[128];
};
int main()
{
//huoqu
// int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
// ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
// int msgget(key_t key, int msgflg);
struct msgbuf readbuf;
int msgid = msgget(0x1234,IPC_CREAT|0777);
if(msgid==-1){
printf("get queue fail\n");
}
msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),888,0);
printf("read from que:%s\n",readbuf.mtext);
struct msgbuf sendbuf = {988,"thank you for reach"};
msgsnd(msgid,&sendbuf,strlen(sendbuf.mtext),0);
return 0;
}
4.共享内存
通过shmget创建,shmmat映射,先写在读。
写:
#include<stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main()
{
// int shmget(key_t key, size_t size, int shmflg);
int shmid;
char *shmaddr;
key_t key;
key=ftok(".",1);
printf("key is :%d \n",key);
shmid=shmget(key,1024*4,IPC_CREAT|0666);
if(shmid==-1){
printf("shmget fail\n");
exit(-1);
}
exit(0);
// void *shmat(int shmid, const void *shmaddr, int shmflg);
shmaddr=shmat(shmid,NULL,0);//ying she
printf("shmat ok\n");
strcpy(shmaddr,"taoyi");
printf("write data:%s\n",shmaddr);
sleep(5);
shmdt(shmaddr);
shmctl(shmid,IPC_RMID,0);
printf("quit \n");
return 0;
}
读:
#include<stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main()
{
// int shmget(key_t key, size_t size, int shmflg);
int shmid;
char *shmaddr;
key_t key;
key=ftok(".",1);
shmid=shmget(key,1024*4,0);
if(shmid==-1){
printf("shmget fail\n");
exit(-1);
}
// void *shmat(int shmid, const void *shmaddr, int shmflg);
shmaddr=shmat(shmid,NULL,0);//ying she
printf("shmat ok\n");
printf("addr:%s\n",shmaddr);
printf("read data:%s\n",shmaddr);
shmdt(shmaddr);
printf("quit \n");
return 0;
}
5.信号
分为两类:1signal 2.sigaction
signal 收
#include<stdio.h>
#include <signal.h>
void handler(int signum)
{
printf("get signnum:%d\n",signum);
switch(signum){
case 2:
printf("SIGINT\n");
break;
case 9:
printf("SIGKILL\n");
break;
case 10:
printf("SIGUSR1\n");
break;
}
printf("never quit\n");
}
int main()
{
//typedef void (*sighandler_t)(int);
//sighandler_t signal(int signum, sighandler_t handler);
signal(SIGINT,handler);
signal(SIGKILL,handler);
signal(SIGUSR1,handler);
while(1);
return 0;
}
signal发
#include<stdio.h>
#include <signal.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int signum;
int pid;
char cmd[128]={0};
signum = atoi(argv[1]);
pid = atoi(argv[2]);
printf("signum=%d,pid=%d\n",signum,pid);
//kill(pid,signum);
sprintf(cmd,"kill -%d %d",signum,pid);
system(cmd);
return 0;
}
2 sigaction 收
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void handler(int signum, siginfo_t *info, void *context)
{
printf("get sigum=%d\n",signum);
if(context!=NULL){
printf("get data= %d\n",info->si_int);
printf("get data= %d\n",info->si_value.sival_int);
printf("get pid from%d\n",info->si_pid);
}
}
int main()
{
// int sigaction(int signum, const struct sigaction *act,
// struct sigaction *oldact);
struct sigaction act;
printf("pid=%d\n",getpid());
act.sa_sigaction=handler;
act.sa_flags=SA_SIGINFO; //be able to get message
sigaction(SIGUSR1,&act,NULL);
while(1);
return 0;
}
sigaction 发
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
// int sigqueue(pid_t pid, int sig, const union sigval value);
int main(int argc, char **argv)
{
int signum;
int pid;
signum = atoi(argv[1]);
pid =atoi(argv[2]);
union sigval value;
value.sival_int = 100;
sigqueue(pid,signum,value);
printf("done\n");
return 0;
}
6.套接字