Linux에서 포크 기능을 사용하는 방법

PHPz
풀어 주다: 2024-02-23 10:18:04
원래의
514명이 탐색했습니다.

리눅스에서 포크 함수의 사용

리눅스 운영체제에서 포크() 함수는 새로운 프로세스를 생성하는 데 사용되는 매우 중요한 시스템 호출 함수입니다. Unix 및 Unix 계열 운영 체제에서 널리 사용됩니다. 이번 글에서는 포크 기능의 사용법을 자세히 소개하고 구체적인 코드 예시를 제공하겠습니다.

1. 포크 함수 개요

포크 함수의 프로토타입은 다음과 같습니다.

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);
로그인 후 복사

포크 함수는 포크를 호출하는 프로세스의 복사본인 새로운 프로세스를 생성합니다. 포크를 호출하면 두 개의 동일한 프로세스, 즉 상위 프로세스와 하위 프로세스가 생성됩니다. 두 프로세스는 메모리에서 독립적이며 독립적인 주소 공간을 갖습니다.

상위 프로세스는 포크를 호출하고 하위 프로세스의 PID(프로세스 ID)를 나타내는 음수가 아닌 숫자를 반환합니다. 하위 프로세스는 포크를 호출하고 0을 반환합니다. 분기 호출이 실패하면 -1이 반환되어 하위 프로세스 생성이 실패했음을 나타냅니다.

2. 포크 함수의 사용법

다음은 포크 함수의 일반적인 사용법입니다.

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
    pid_t pid;

    pid = fork();

    if (pid < 0) {
        // fork调用失败
        perror("fork");
        return 1;
    } else if (pid == 0) {
        // 子进程
        printf("Hello from child process! PID=%d
", getpid());
    } else {
        // 父进程
        printf("Hello from parent process! PID=%d, Child PID=%d
", getpid(), pid);
    }

    return 0;
}
로그인 후 복사

위의 예에서는 포크 함수를 통해 새로운 자식 프로세스를 만들었습니다. 자식 프로세스에서는 "Hello from child process!"와 현재 프로세스의 PID를 인쇄합니다. 상위 프로세스에서는 현재 프로세스의 PID와 하위 프로세스의 PID와 함께 "Hello from parent process!"를 인쇄합니다.

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Hello from parent process! PID=1234, Child PID=1235
Hello from child process! PID=1235
로그인 후 복사

fork 함수가 성공적으로 호출되면 상위 프로세스와 하위 프로세스가 프로그램의 후속 코드를 동시에 실행하는 것을 볼 수 있습니다. .

3. 포크 함수의 반환 값

위의 예에서는 포크 함수의 반환 값을 사용하여 현재 프로세스가 상위 프로세스인지 하위 프로세스인지 확인합니다.

  • 반환 값이 음수(-1)이면 포크 호출이 실패했음을 의미합니다.
  • 반환값이 0이면 현재 프로세스가 자식 프로세스라는 뜻입니다.
  • 반환 값이 0보다 크면 현재 프로세스가 상위 프로세스이고, 반환 값이 하위 프로세스의 PID임을 의미합니다.

4. 포크 기능의 실제 응용

포크 기능은 다중 프로세스 동시 서버, 프로세스 풀 등 실제 개발에서 많은 응용 시나리오를 갖습니다. 다음은 포크 기능을 사용하여 간단한 동시 서버를 구현하는 방법을 보여주는 간단한 예입니다.

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

#define PORT 8888
#define MAX_BUFFER_SIZE 1024

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    pid_t child_pid;

    // 创建socket
    server_fd = socket(AF_INET, SOCK_STREAM, 0);

    // 设置address
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    // 绑定socket和address
    bind(server_fd, (struct sockaddr *)&address, sizeof(address));

    // 监听socket
    listen(server_fd, 5);

    while (1) {
        // 接受客户端连接
        new_socket = accept(server_fd, NULL, NULL);

        // 创建子进程来处理客户端请求
        child_pid = fork();

        if (child_pid < 0) {
            // fork调用失败
            perror("fork");
            return 1;
        } else if (child_pid == 0) {
            // 子进程
            char buffer[MAX_BUFFER_SIZE] = {0};
            read(new_socket, buffer, MAX_BUFFER_SIZE);
            printf("Received message: %s
", buffer);
            close(new_socket);
            return 0;
        } else {
            // 父进程
            // 关闭父进程不需要的socket
            close(new_socket);
        }
    }

    return 0;
}
로그인 후 복사

위의 예에서는 포크 기능을 사용하여 다중 프로세스 동시 서버를 구현했습니다. 클라이언트가 연결되면 클라이언트 요청을 처리하기 위한 하위 프로세스를 만듭니다. 상위 프로세스는 계속해서 다른 클라이언트의 연결을 수신합니다. 이러한 방식으로 여러 클라이언트 연결 요청을 동시에 처리하고 서버의 동시 성능을 향상시킬 수 있습니다.

요약:

이 글에서는 Linux의 포크 기능 사용법을 소개하고 몇 가지 구체적인 코드 예제를 제공했습니다. 포크(fork) 기능은 리눅스 운영체제에서 매우 중요한 시스템 호출 기능으로, 새로운 프로세스를 생성하고 해당 프로세스의 동시 실행을 가능하게 한다. 포크 기능을 합리적으로 사용함으로써 복잡한 동시 애플리케이션을 구현하고 시스템 성능을 향상시킬 수 있습니다.

위 내용은 Linux에서 포크 기능을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!