1. 이름 없는 파이프(pipe) : 파이프는 반이중 통신 방식으로, 데이터는 한 방향으로만 흐를 수 있고, 연관된 프로세스 사이에서만 사용할 수 있다. 프로세스 선호도는 일반적으로 상위-하위 프로세스 관계를 나타냅니다.
int fd[2];//0读出,1写入
pipe(fd);
int pid = fork();
if(pid==0){
close(fd[1]);
read(fd[0], buf, len);
}else if(pid>0){
close(fd[0]);
write(fd[1], buf, len);
}
2. 어드밴스드 파이프라인(popen): 현재 프로그램 프로세스에서 새로운 프로세스로 다른 프로그램이 시작되면 이를 현재 프로그램의 서브 프로세스로 간주하는 방식을 어드밴스드 파이프라인 방식이라고 합니다.
FILE *fp = popen(cmd, mode);
fread(buf, n, size, fp);
3. 네임드 파이프(Named Pipe): 네임드 파이프도 반이중 통신 방법이지만 관련 없는 프로세스 간의 통신을 허용합니다.
mkfifo(path,mode);
fd = open(path,mode);
write(fd,xxx);
read(fd,xxx);
4. 메시지 큐(메시지 큐): 메시지 큐는 연결된 메시지 목록으로, 커널에 저장되고 메시지 큐 식별자로 식별됩니다. 메시지 큐는 신호 전송 정보가 적다는 단점, 파이프는 형식화되지 않은 바이트 스트림만 전달할 수 있고 버퍼 크기가 제한된다는 단점을 극복합니다.
int msgget(key_t key,int msgflg);
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflag);
ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg);
5. 세마포어: 세마포어는 여러 프로세스가 공유 리소스에 대한 액세스를 제어하는 데 사용할 수 있는 카운터입니다. 이는 프로세스가 리소스에 액세스할 때 다른 프로세스가 공유 리소스에 액세스하지 못하도록 방지하기 위한 잠금 메커니즘으로 자주 사용됩니다. 따라서 주로 프로세스 간 및 동일한 프로세스 내의 다른 스레드 간 동기화 수단으로 사용됩니다.
int semget(key_t key, int num_sems, int sem_flags);
struct sembuf{
short sem_num;//除非使用一组信号量,否则它为0
short sem_op;//信号量在一次操作中需要改变的数据,通常是两个数,一个是-1,即P(等待)操作,
//一个是+1,即V(发送信号)操作。
short sem_flg;//通常为SEM_UNDO,使操作系统跟踪信号,
//并在进程没有释放该信号量而终止时,操作系统释放信号量
};
int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);
union semun{
int val;
struct semid_ds *buf;
unsigned short *arry;
};
int semctl(int sem_id, int sem_num, int command, ...);
6. 신호: 신호는 이벤트가 발생했음을 수신 프로세스에 알리는 데 사용되는 비교적 복잡한 통신 방법입니다.
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
-->
void (*signal(int signum, void (*handler)(int)))(int);
功能:设置信号对进程的处理方式
参数:
signum:信号
handler:处理方式
SIG_IGN 忽略,当信号产生后对当前进程没有任何影响
SIG_DFL 缺省,按照当前信号默认的方式处理
void (*handler)(int sig) 信号处理函数,自定义函数来处理产生信号之后的过程
sig:调用signal时的第一个参数
返回值:
成功:返回修改之前信号对进程的处理方式
失败:SIG_ERR
//发送信号
int kill(pid_t pid, int sig);//sig包含多种信号
int raise(int sig);
//等待信号
int pause(void);
unsigned int alarm(unsigned int seconds);
7. 공유 메모리: 공유 메모리는 다른 프로세스에서 접근할 수 있는 메모리 영역을 매핑하는 것으로, 이 공유 메모리는 하나의 프로세스에서 생성되지만 여러 프로세스에서 접근할 수 있습니다. 공유 메모리는 가장 빠른 IPC 방법이며 다른 프로세스 간 통신 방법의 비효율성을 위해 특별히 설계되었습니다. 프로세스 간 동기화 및 통신을 달성하기 위해 신호와 같은 다른 통신 메커니즘과 함께 사용되는 경우가 많습니다.
8. 소켓: 소켓은 프로세스 간 통신 메커니즘이기도 하며, 다른 통신 메커니즘과 달리 서로 다른 시스템 간의 프로세스 통신에 사용할 수 있습니다.