이 문제에서 우리는 fork()와 pipe()를 보여줄 것입니다. 여기서 우리는 두 개의 문자열을 연결하는 Linux용 C 프로그램을 만들 것입니다. 2개의 프로세스를 사용하여 하나는 입력을 받아 다른 사람에게 보낼 것입니다. 이 프로그램은 문자열을 미리 정의된 문자열과 연결하고 연결된 문자열을 반환합니다.
먼저 fork() 및 pipe()를 요약하겠습니다.
포크() − 하위 프로세스를 생성하며 이 하위 프로세스는 새로운 PID 및 PPID를 생성합니다.
파이프() 프로세스 간 통신에 사용되는 Unix, Linux 시스템 호출입니다.
문제를 이해하기 위한 예를 들어보겠습니다.
입력
Learn programming Predefined string: at tutorialspoint
출력
Learn programming at tutorialspoint
설명
P1 take input of string “learn programming”
파이프를 사용하여 P2로 보냅니다.
P2는 문자열을 연결하고 p1로 다시 전송하여 인쇄합니다.
프로그램에서 우리는 fork() 함수를 사용하여 P1과 P2라는 두 개의 프로세스를 생성할 것입니다. 프로그램 상태를 나타내는 다음 세 가지 반환 값이 있습니다.
반환 값 <0, 프로세스 생성에 실패했습니다.
반환 값 =0, 자식 프로세스.
반환 값> 0, 부모 프로세스에 대한 자식 프로세스의 프로세스 ID가 됩니다. 즉, 부모 프로세스가 실행됩니다.
파이프는 단방향이므로 P1에서 P2로, 다른 하나는 P2에서 P1으로 통신하기 위한 두 개의 파이프를 만듭니다.
fork() 및 pipe()를 시연하는 C 프로그램
예시
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<string.h> #include<sys/wait.h> int main(){ int p12[2]; int p21[2]; char fixed_str[] = " at tutorialspoint"; char input_str[100]; pid_t P; if (pipe(p12)==-1 || pipe(p21)==-1 ){ fprintf(stderr, "Filed to create pipe" ); return 1; } scanf("%s", input_str); P = fork(); if (P < 0){ fprintf(stderr, "fork Failed" ); return 1; } else if (P > 0){ char concat_str[100]; close(p12[0]); write(p12[1], input_str, strlen(input_str)+1); close(p12[1]); wait(NULL); close(p21[1]); read(p21[0], concat_str, 100); printf("Concatenated string %s\n", concat_str); close(p21[0]); } else{ close(p12[1]); char concat_str[100]; read(p12[0], concat_str, 100); int k = strlen(concat_str); int i; for (i=0; i<strlen(fixed_str); i++) concat_str[k++] = fixed_str[i]; concat_str[k] = '\0'; close(p12[0]); close(p21[0]); write(p21[1], concat_str, strlen(concat_str)+1); close(p21[1]); exit(0); } }
출력
Concatenated string Learn at tutorialspoint