기본 프로세스 통신 방법

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. 소켓: 소켓은 프로세스 간 통신 메커니즘이기도 하며, 다른 통신 메커니즘과 달리 서로 다른 시스템 간의 프로세스 통신에 사용할 수 있습니다.

Supongo que te gusta

Origin blog.csdn.net/HideInTime/article/details/124745810
Recomendado
Clasificación