한 스레드에서 다른 스레드로 메시지 (C)를 보내는 방법은 무엇입니까?

Hisu

한 스레드에서 다른 스레드로 메시지를 보내려고합니다. 각 스레드는 다른 스레드의 ID를 알고 있습니다. 그들 사이에 어떻게 메시지를 보낼 수 있습니까?

이미 몇 가지 제안 된 솔루션 (메시지 대기열, 익명 파이프 등)을 보았지만 솔직히 작동하지 않았습니다. 분명히 나는 ​​이전 설명을 충분히 이해하지 못했기 때문에이 주제를 다루었습니다.

요약하자면 가능한 가장 짧은 전송 방법입니다. "Hello!"라는 메시지를 봅시다. 스레드에서 다른 스레드로, 두 번째 스레드가 stderr에 표시하도록 만들고 첫 번째 스레드 메시지 'Hello back!'으로 다시 보냅니다.

아마 매우 쉬웠고 연구를 잘하지 못했지만 지금은 한동안 갇혀 있었기 때문에 적절한 방법을 찾을 수 없습니다.

안녕 천사

예를 들어, 매우 간단합니다. 먼저 pipe(). 두 개의 파일 설명자를 만듭니다. 하나는 읽기 용이고 다른 하나는 쓰기 용입니다. 여기서 우리는 읽기와 쓰기를 모두 두 번 호출합니다. 그런 다음 fork (두 번째 스레드를 만드는)를 호출 하고 생성 한 파이프를 통해 메시지를 쓰고 읽습니다.

#include <poll.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int wait_n_read(int fd, char* buf, int szBuf) {
    struct pollfd pfd = {
        .fd      = fd,
        .events  = POLLIN,
        .revents = 0
    };
    poll(&pfd, 1, -1); //wait for an event
    int ret = read(fd, buf, szBuf);
    if (ret == -1) {
        perror("In read()");
    }
    return ret;
}

main(){
    int chan[4];
    enum{
        thread1_read  = 0, //read end for parent
        thread2_write = 1, //write end for child 
        thread2_read  = 2, //read end for child 
        thread1_write = 3  //write end for parent
    };
    if (pipe(&chan[thread1_read]) == -1 || (pipe(&chan[thread2_read]) == -1)){
        perror("In pipe");
        return 1;
    }
    switch(fork()) {
        case -1:
            perror("In fork()");
            return 1;
        case 0:{ //it's a child
            char buf[256];
            memset(buf, 0, sizeof(buf));
            if (wait_n_read(chan[thread2_read], buf, sizeof(buf)-1) == -1)
                return 1;
            fputs(buf, stderr);
            const char helloback[] = "Hello back\n";
            write(chan[thread2_write], helloback, sizeof(helloback));
            return 0;
        }
        default: { //a parent
            const char hello[] = "Hello\n";
            write(chan[thread1_write], hello, sizeof(hello));
            char buf[256];
            memset(buf, 0, sizeof(buf));
            if (wait_n_read(chan[thread1_read], buf, sizeof(buf-1)) == -1)
                return 1;
            fputs(buf, stderr);
        }
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

다른 메서드를 호출하여 한 개체의 메서드에서 스레드를 시작하는 방법은 무엇입니까?

분류에서Dev

Python 플라스크 서버, 다른 요청의 스레드에 메시지를 보내는 방법은 무엇입니까?

분류에서Dev

C #에서 winapi32 함수를 사용하여 스레드에서 스레드로 메시지를 보내는 방법은 무엇입니까?

분류에서Dev

다른 스레드에서 동일한 클래스의 다른 메서드를 실행하는 방법은 무엇입니까?

분류에서Dev

다른 스레드 중에서 특정 스레드를 중지하는 방법은 무엇입니까?

분류에서Dev

한 스레드에서 다른 스레드를 중지하는 데 동기화 된 방법의 중요성은 무엇입니까?

분류에서Dev

다른 스레드에서 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

Retrofit onResponse 메서드에서 반환 한 Json 데이터를 다른 클래스로 보내는 방법은 무엇입니까?

분류에서Dev

Google 스프레드 시트, 한 배열에서 다른 배열을 빼는 방법은 무엇입니까?

분류에서Dev

한 스레드가 다른 스레드를 기다리게하는 방법은 무엇입니까?

분류에서Dev

Laravel (+ Vue.js) Broadcast-카운트 다운을 설정 한 다음 브로드 캐스트 메시지를 보내는 방법은 무엇입니까?

분류에서Dev

여러 스레드가 서로 다른 클래스의 메서드를 순서대로 실행하는지 확인하는 방법은 무엇입니까?

분류에서Dev

한 스레드에서 arraylist를 반복하고 다른 스레드에서 추가하는 방법은 무엇입니까?

분류에서Dev

한 스레드에서 변수를 수정하고 다른 스레드에서 확인하는 방법은 무엇입니까?

분류에서Dev

SCDF에서 두 개의 다른 출력 채널로 메시지를 보내는 방법은 무엇입니까?

분류에서Dev

c # asp.net-다른 스레드에서 현재 페이지 URL을 찾는 방법은 무엇입니까?

분류에서Dev

Scenic을 사용하여 한 장면에서 다른 장면으로 메시지를 보내는 방법은 무엇입니까?

분류에서Dev

다른 스레드가 visualC #에서 작동하는 동안 한 스레드를 잠자는 방법은 무엇입니까?

분류에서Dev

일반 T를 다른 스레드로 보내는 방법은 무엇입니까?

분류에서Dev

한 서비스 버스에서 다른 서비스 버스로 메시지를 복사하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

이 다중 스레드 상황에서 깨끗한 코드를 작성하는 방법은 무엇입니까?

분류에서Dev

한 테이블에서 다른 테이블로 레코드를 삽입하는 방법은 무엇입니까?

분류에서Dev

한 스레드의 값을 수정하고 공유 메모리를 사용하여 다른 스레드의 값을 읽는 방법은 무엇입니까?

분류에서Dev

while 루프에서 서로 다른 절전 시간으로 3 개의 스레드를 동시에 실행하는 방법은 무엇입니까?

분류에서Dev

한 Accurev 서버에서 다른 Accurev 서버로 코드베이스를 내보내는 방법은 무엇입니까?

분류에서Dev

한 스레드에서 다른 스레드에 신호를 보내는 가장 빠른 방법

분류에서Dev

스레드로부터 안전한 방식으로 .NET ConcurrentDictionary에서 GetOrAdd 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

다른 스레드의 정적 메서드에서 텍스트 상자의 텍스트를 변경하는 방법은 무엇입니까?

분류에서Dev

다른 스레드 그룹에 다른 수의 스레드를 설정하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    다른 메서드를 호출하여 한 개체의 메서드에서 스레드를 시작하는 방법은 무엇입니까?

  2. 2

    Python 플라스크 서버, 다른 요청의 스레드에 메시지를 보내는 방법은 무엇입니까?

  3. 3

    C #에서 winapi32 함수를 사용하여 스레드에서 스레드로 메시지를 보내는 방법은 무엇입니까?

  4. 4

    다른 스레드에서 동일한 클래스의 다른 메서드를 실행하는 방법은 무엇입니까?

  5. 5

    다른 스레드 중에서 특정 스레드를 중지하는 방법은 무엇입니까?

  6. 6

    한 스레드에서 다른 스레드를 중지하는 데 동기화 된 방법의 중요성은 무엇입니까?

  7. 7

    다른 스레드에서 메서드를 호출하는 방법은 무엇입니까?

  8. 8

    Retrofit onResponse 메서드에서 반환 한 Json 데이터를 다른 클래스로 보내는 방법은 무엇입니까?

  9. 9

    Google 스프레드 시트, 한 배열에서 다른 배열을 빼는 방법은 무엇입니까?

  10. 10

    한 스레드가 다른 스레드를 기다리게하는 방법은 무엇입니까?

  11. 11

    Laravel (+ Vue.js) Broadcast-카운트 다운을 설정 한 다음 브로드 캐스트 메시지를 보내는 방법은 무엇입니까?

  12. 12

    여러 스레드가 서로 다른 클래스의 메서드를 순서대로 실행하는지 확인하는 방법은 무엇입니까?

  13. 13

    한 스레드에서 arraylist를 반복하고 다른 스레드에서 추가하는 방법은 무엇입니까?

  14. 14

    한 스레드에서 변수를 수정하고 다른 스레드에서 확인하는 방법은 무엇입니까?

  15. 15

    SCDF에서 두 개의 다른 출력 채널로 메시지를 보내는 방법은 무엇입니까?

  16. 16

    c # asp.net-다른 스레드에서 현재 페이지 URL을 찾는 방법은 무엇입니까?

  17. 17

    Scenic을 사용하여 한 장면에서 다른 장면으로 메시지를 보내는 방법은 무엇입니까?

  18. 18

    다른 스레드가 visualC #에서 작동하는 동안 한 스레드를 잠자는 방법은 무엇입니까?

  19. 19

    일반 T를 다른 스레드로 보내는 방법은 무엇입니까?

  20. 20

    한 서비스 버스에서 다른 서비스 버스로 메시지를 복사하는 가장 좋은 방법은 무엇입니까?

  21. 21

    이 다중 스레드 상황에서 깨끗한 코드를 작성하는 방법은 무엇입니까?

  22. 22

    한 테이블에서 다른 테이블로 레코드를 삽입하는 방법은 무엇입니까?

  23. 23

    한 스레드의 값을 수정하고 공유 메모리를 사용하여 다른 스레드의 값을 읽는 방법은 무엇입니까?

  24. 24

    while 루프에서 서로 다른 절전 시간으로 3 개의 스레드를 동시에 실행하는 방법은 무엇입니까?

  25. 25

    한 Accurev 서버에서 다른 Accurev 서버로 코드베이스를 내보내는 방법은 무엇입니까?

  26. 26

    한 스레드에서 다른 스레드에 신호를 보내는 가장 빠른 방법

  27. 27

    스레드로부터 안전한 방식으로 .NET ConcurrentDictionary에서 GetOrAdd 메서드를 호출하는 방법은 무엇입니까?

  28. 28

    다른 스레드의 정적 메서드에서 텍스트 상자의 텍스트를 변경하는 방법은 무엇입니까?

  29. 29

    다른 스레드 그룹에 다른 수의 스레드를 설정하는 방법은 무엇입니까?

뜨겁다태그

보관