내 프로그램에서 fork 및 exec 시스템 호출을 사용해야합니다. exec는 자식 프로세스를 변경하여 다른 명령을 인수로 사용하고 해당 명령을 실행합니다. ./myexecv cat etc/motd
아무 일을 실행하지 후이 내 현재 코드포크 및 execve 세그먼트 화 오류
extern char **environ; /* environment info */
main(int argc, char **argv) {
/* argc -- number of arguments */
/* argv -- an array of strings */
char *argvNew[argc + 1];
int pid;
for(int i=0; i<argc; i++){
argvNew[i] = argv[i];
}
argvNew[argc + 1] = NULL;
printf("After For: %s\n",argvNew[0]);
printf("After For: %s\n",argvNew[1]);
printf("After For: %s\n",argvNew[2]);
printf("After For: %s\n",argvNew[3]);
if ((pid = fork()) < 0) {
fprintf(stderr, "Fork error%sstrerror\n", strerror(errno));
exit(1);
}
else if (pid == 0) {
/* child process */
if (execve(argvNew[0], argvNew, environ) < 0) {
fprintf(stderr, "Execve error%d %s\n",errno,strerror(errno));
exit(1);
}
}
else {
/* parent */
wait(0); /* wait for the child to finish */
}
}
이
./myexec cat /etc/motd
입니다 : 예를 들어, 오늘의 메시지를 표시합니다 그냥 인쇄 문. 앞으로 어떤 조언이 필요합니까?
절대 인수 목록을 복사 할 필요가 없습니다. 'execv()'대신에'execve()'를 사용하라는 정식 명령이 없다면 그것을 사용하십시오. 전체 코드는'execv (argv [1], & argv [1]);''- 포크 없음, 복사 안 함, 기다리지 않음, 그 밖의 아무것도 없다. 원래 코드의 fork/exec/wait 체제의 유일한 "이점"은 실행 된 명령이 성공했는지 여부에 관계없이 부모로부터의 리턴 코드가 항상 0이라는 것입니다 (C99 또는 더 나은 컴파일러를 사용한다고 가정 할 때 떨어지는 main의 끝에서'return 0'과 동등하지만'main'은 명백한'int' 리턴 타입을 가져야합니다). –
답변 해 주셔서 감사합니다. 그러나 명령을 작성한 후에도 아무 일도 일어나지 않습니다. ~/Documents $ ./myfork ls -l 이후 대상 : ls 이후 대상 : -l 이후 : (null) 이후 : (null) 다음 오류 메시지가 없습니다. 디렉토리 – SolRac
아 ...'execv()'또는'execve()'를 사용하면 실행 파일의 절대 이름 (또는 현재 디렉토리에 상대적인 이름)을 지정해야합니다. './myexec/bin/cat/etc/motd' (또는'cat /'이있는 곳이면'./myexec/usr/bin/cat/etc/motd')를 시도해보십시오. 그게 효과가있다. 'cat'에 대해 쉘과 같은 PATH 기반 검색을 수행하려면'execvp()'를 사용하십시오. - 코드를 찾을 수 있고 정말로 원한다면 [execvpe()'] (http : // stackoverflow. co.kr/questions/7789750), 환경을 변경하지 않으므로 환경 설정 변종을 사용할 필요가 없습니다. –