2017-04-13 1 views
0

대학에서 과제를 받았는데 파이프에서 bash 명령을 읽고이 명령을 실행해야합니다. 나는 execv *를 사용할 생각이다. 왜냐하면 나는 분리 문자로 공간을 나누어서 버퍼를 만들 수 있기 때문이다. 문제는 내가 STL 라이브러리를 사용할 수 없다는 것과이 버퍼의 크기가 가변적이기 때문에 어떻게이 버퍼가 만들어 져야 하는지를 알 수 없다는 것입니다. 어떤 제안? 미리 감사가execv 용 버퍼 크기

당신은 단지 하나 개의 파이프 명령을 아래와 같이 할 경우
+0

이, 적당히 높은 상한을 선택 당신이 필요로 얼마나 많은 알 수 있도록 먼저 계산, 또는를 malloc'ing하여 자신 만의 확장 가능한 벡터를 구현하기 위해 패스를 수행 아래와 같이 execvp는 사용 더 큰 영역을 선택하고 필요할 때마다 데이터를 복사합니다. –

+0

예, 상한선에 대해 생각하고 있었지만 상한선이 xD인지 확인하지 못했습니다. 성장할 수있는 벡터의 경우, 텍스트를 두 번 읽어야한다는 것을 구현하기 위해 계산을 위해 한 번, 버퍼에 한 번 더 추가해야한다고 생각합니다. –

+0

당신은 단지 128k 나 그 밖의 다른 것을 골라서 할당에서 적중하지 않을 것입니다 (128k는 리눅스의 execve를위한 전통적인 바이트 크기 제한입니다). 처음에 계산하면 이미 크기를 알고 있기 때문에 성장할 필요조차 없습니다. 성장하는 것은 크기 N의 버퍼에 추가하는 것일 뿐이며 N에 도달하면 2 * N을 할당하고 모든 요소를 ​​복사 한 다음 계속 추가합니다. –

답변

2

, 버퍼 크기 (30)도

ls -l | wc -l 

더 그러나 여러 파이프 명령을 지원할 수만큼, 당신은 우는 소리 같은 명령을 얻을 것이다 당신의 버퍼 크기가 충분히 그것을

cat index.html | grep ".com" | grep ".splunk." | cut -d "<" -f2 | cut -d ">" -f1 | grep ":" | cut -d":" -f2 | cut -d "/" -f3 | cut -d " " -f1 | grep ".splunk." | cut -d '"' -f1 | sort | uniq 

귀하의 버퍼 크기 (100)를해야해야합니다, 나는 당신처럼 내 운영 체제 프로젝트의 크기 (100)를 choosed 할, 우리는 터미널을 구현, 거의 모든 것을, 여러 파이프, 리디렉션 등을 지원 ...

은 또한, 나는

execvp(args[0], &args[0]); 
+0

답변 해 주셔서 감사합니다. 100으로 배관하기에 충분한 이유가 있습니까? –

+0

아니요, 특별한 이유가 없습니다. 터미널이이 임계 값을 지원한다고 말하는데 충분한 값이라고 생각합니다. 크기를 구현할 수는 있지만 아무런 제한이 없습니다. –

+0

그래, 다시 한번 감사드립니다! –