exec 출력을 버퍼 또는 파일로 재연결
는 C라는 fork()
,exec()
, , , , 입니다.wait()
실행한 프로그램의 출력을 파일이나 버퍼에 쓰고 싶습니다.
를 들어 exec을 했을 ls
file1 file2 etc
★★★★★★★★★★★★★★★★★★★★★.읽을 수 있는 방법은 없는 것 같은데, 파이프를 사용해야 하는 건가요?가가 찾찾 한한 반반 반? ???
출력을 다른 파일로 보내는 경우(중요한 세부 정보에 초점을 맞추기 위해 오류 검사를 생략합니다).
if (fork() == 0)
{
// child
int fd = open(file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
dup2(fd, 1); // make stdout go to file
dup2(fd, 2); // make stderr go to file - you may choose to not do this
// or perhaps send stderr to another file
close(fd); // fd no longer needed - the dup'ed handles are sufficient
exec(...);
}
출력을 파이프로 전송하여 출력을 버퍼로 읽을 수 있도록 하기 위해:
int pipefd[2];
pipe(pipefd);
if (fork() == 0)
{
close(pipefd[0]); // close reading end in the child
dup2(pipefd[1], 1); // send stdout to the pipe
dup2(pipefd[1], 2); // send stderr to the pipe
close(pipefd[1]); // this descriptor is no longer needed
exec(...);
}
else
{
// parent
char buffer[1024];
close(pipefd[1]); // close the write end of the pipe in the parent
while (read(pipefd[0], buffer, sizeof(buffer)) != 0)
{
}
}
당신은 정확히 무엇을 하고 싶은지 결정할 필요가 있다 - 그리고 가급적 그것을 좀 더 명확하게 설명할 필요가 있다.
옵션 1: 파일
실행된 명령어 출력의 대상이 되는 파일을 알고 있는 경우는, 다음과 같이 합니다.
- 부모와 자녀가 이름에 동의하는지 확인합니다(부모는 포킹 전에 이름을 결정합니다).
- 상위 포크 - 두 가지 프로세스가 있습니다.
- Child는 파일 기술자 1(표준 출력)이 파일로 이동하도록 항목을 재구성합니다.
- 일반적으로 표준 오류는 그대로 둘 수 있습니다. /dev/null에서 표준 입력을 리디렉션할 수 있습니다.
- 그런 다음 자녀는 관련 명령을 실행합니다. 해당 명령이 실행되고 표준 출력이 파일로 전송됩니다(이것은 기본 셸 I/O 리다이렉션입니다).
- 실행된 프로세스가 종료됩니다.
- 한편, 상위 프로세스는 다음 두 가지 주요 전략 중 하나를 채택할 수 있습니다.
- 읽기 위해 파일을 열고 EOF에 도달할 때까지 계속 읽습니다.그런 다음 아이가 죽었는지(더 이상 읽을 데이터가 없도록) 다시 확인하거나 아이의 입력을 기다리며 서성거려야 합니다.
- 아이가 죽을 때까지 기다렸다가 파일을 열어 읽습니다.
- 첫 번째 장점은 부모가 자녀의 실행 중에도 일부 작업을 수행할 수 있다는 것입니다. 두 번째 장점은 I/O 시스템(과거 EOF를 반복하여 읽을 필요가 없다는 것입니다.
옵션 2: 파이프
부모가 자녀의 출력을 읽도록 하려면 자녀가 출력을 부모에게 다시 파이프로 연결하도록 합니다.
- 이를 쉽게 수행하려면 popen()을 사용합니다.그러면 프로세스가 실행되고 출력이 부모 프로세스로 전송됩니다.파이프가 작은 버퍼 크기(종종 4-5KB)를 가지며, 부모가 읽지 않을 때 자녀가 더 많은 데이터를 생성하면 부모가 읽을 때까지 자녀는 차단되므로 자녀가 출력을 생성하는 동안 부모가 활성화해야 합니다.부모가 아이가 죽기를 기다리고 있으면 교착 상태가 됩니다.
- 이를 수행하려면 pipe() 등을 사용합니다.부모가 pipe()를 호출한 후 forks를 호출합니다.아이는 파이프의 쓰기 끝이 표준 출력이 되도록 배관을 분류하고 파이프와 관련된 다른 모든 파일 기술자가 닫히도록 합니다.이 경우 dup2() 시스템콜을 사용할 수 있습니다.그런 다음 필요한 프로세스를 실행하여 파이프에 표준 출력을 전송합니다.
- 한편, 부모도 파이프의 불필요한 끝을 닫고 나서 판독을 개시합니다.파이프에 EOF가 발생하면 어린이가 파이프를 완료하고 닫았음을 인식하고 파이프의 끝을 닫을 수도 있습니다.
Linux/cygwin 환경에서 사용하는 것처럼 보이므로 popen을 사용해야 합니다.파일을 여는 것과 같으며, 실행 중인 프로그램을 얻을 수 있는 것은 자신뿐입니다.stdout
, 따라서, 통상의 사용법을 사용할 수 있습니다.fscanf
,fread
기타.
포킹 후 를 사용하여 파일의 FD를 stdout의 FD로 복제한 다음 exec을 실행합니다.
Linux 를 사용할 수도 있습니다.sh
명령어를 사용하여 리다이렉션을 포함하는 명령어를 전달합니다.
string cmd = "/bin/ls > " + filepath;
execl("/bin/sh", "sh", "-c", cmd.c_str(), 0);
언급URL : https://stackoverflow.com/questions/2605130/redirecting-exec-output-to-a-buffer-or-file
'programing' 카테고리의 다른 글
Vuex는 변환 핸들러 외부의 vuex 저장소 상태를 변환하지 않음 - Vuetify (0) | 2022.08.29 |
---|---|
내용이 있는 경우에만 슬롯 표시 (0) | 2022.08.29 |
Eclipse에서 TODO 태그 찾기 (0) | 2022.08.29 |
VeValidate 'required_if:' 규칙 확인 (0) | 2022.08.29 |
수술 조건과 함께 #ifdef를 사용하는 방법 (0) | 2022.08.29 |