프로그램 설명 대신 새 프로그램에 부모 프로세스 ID를 유지하고있다 : 나는 C와 리눅스에서 프로세스에 대한 가르쳐 도움이되는 프로그램을하고 있어요execv와 제로
. 프로그램은 fork
을 사용하여 하위 프로세스를 만든 다음 부모와 자식 모두가 Parent Process
, Child Process
이라는 메시지를 일정 시간 출력합니다. 사물이 뒤섞이는 것을 막기 위해 부모는 자식 프로세스가 메시지를 모두 인쇄하기를 기다립니다. 더 재미있는 일을 만들기 위해 자식 프로세스는 execv
을 사용하여 메시지를 인쇄하는 다른 프로그램을 호출합니다.
내가 읽은 것부터 execv
새 프로세스가 시작되지 않았습니다. 새 프로세스 이미지는 원래 프로세스 이미지를 오버레이합니다. 따라서 자식 프로세스가 새 프로그램을 시작할 때 그 새 프로그램 내부의 프로세스 ID는 0 인 자식 프로세스 ID와 같아야합니다.
문제 : 나는 그것이 바로 내가 프로세스 ID를 출력 새로운 프로그램에 들어가기로 제로 (예상대로)하지만입니다 execv
를 호출하기 전에 자식 프로세스의 ID를 인쇄하고는있다
부모 프로세스 ID (하지만 자식 ID 여야 함).
누구든지 새 프로그램에 프로세스 ID가 0이 아닌 이유를 설명해주세요.
인수 :는
- 은
Argv[1]
는 = 횟수 자식 프로세스에 대한 메시지를 인쇄는 는
Argv[2]
는 = 횟수는 부모 프로세스에 대한 메시지를 인쇄Argv[3]
는 = (초) 기다렸다 자식 프로세스에 대한 메시지 이후Argv[4]
= 부모 프로세스에 대한 메시지 이후에 대기 한 시간 (초) sArgv[5]
= 자식 프로세스가 시작될 새 프로그램에 메시지가 전송됩니다 (자식 프로세스가 메시지를 인쇄 할 수 있음).
초기 프로그램 :
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int arg, char *argv[]) {
if(arg < 6) {
printf("\n\t(Task4.c) Please provide the right arguments\n\n");
exit(EXIT_FAILURE);
}
char *argv2[3];
argv2[0] = argv[1];
argv2[1] = argv[3];
argv2[2] = argv[5];
int Nc = atoi(argv[1]);
int Np = atoi(argv[2]);
int Tc = atoi(argv[3]);
int Tp = atoi(argv[4]);
int n, exit_code;
pid_t pid;
char *message;
printf("\n\n(Task4.c)\tfork program starting\n");
pid = fork();
//Let child go first before the parent
if(pid != 0) {
int stat_val;
pid_t child_pid;
child_pid = wait(&stat_val);
printf("\n(Task4.c)\tChild has finished: PID = %d\n", child_pid);
if(WIFEXITED(stat_val))
printf("(Task4.c)\tChild exited with code %d\n\n", WEXITSTATUS(stat_val));
else
printf("(Task4.c)\tChld terminated abnormally\n");
}
//Set up the values for the parent and child
switch(pid)
{
case -1:
perror("(Task4.c)\tfork failed");
exit(1);
case 0:
/* a child execute different program */
printf("\n(Task4.c)\tpid=%d\n\n", pid);
if (execv ("child", argv2) <0)
{
printf ("(Task4.c)\texecl ERROR");
exit (EXIT_FAILURE);
}
break;
default:
message = "This is the parent";
n = Np;
exit_code = 0;
break;
}
//Print the message for the process using their values
for(; n > 0; n--) {
printf("(Task4.c)\tpid=%d ", pid);
puts(message);
switch(pid)
{
case 0:
sleep(Tc);
break;
default:
sleep(Tp);
break;
}
}
printf("\n\n");
exit(exit_code);
}
새 프로그램이 자식 프로세스에 의해 호출되는 :
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int arg2, char *argv2[]) {
if(arg2 < 3) {
printf("\n\t(child.c) Please provide the right arguments\n\n");
exit(EXIT_FAILURE);
}
int Nc2 = atoi(argv2[0]);
int Tc2 = atoi(argv2[1]);
int Np2 = 5;
int Tp2 = 1;
int n2, exit_code2;
//Here I was expected to get 0 as the pid...
pid_t pid2 = getpid();
char *message2;
printf("(child.c)\tchild program starting\n\n");
printf("(child.c)\tpid=%d \n\n", pid2);
switch(pid2)
{
case -1:
perror("(child.c) fork failed");
exit(1);
case 0:
message2 = argv2[2];
n2 = Nc2;
exit_code2 = 37;
break;
default:
message2 = "(child.c)\tThis is the parent";
n2 = Np2;
exit_code2 = 0;
break;
}
for(; n2 > 0; n2--) {
printf("(child.c)\tpid=%d ", pid2);
puts(message2);
switch(pid2)
{
case 0:
sleep(Tc2);
break;
default:
sleep(Tp2);
break;
}
}
exit(37);
}
예 출력 :
- 으로 ("아이부터 안녕하세요"5 3 1 1) 등의 인수는
자녀의 PID가 0이 아닙니다. 그것은 자식에서 fork에 의해 반환 된 값입니다. try try getpid() –
"child.c"라는 새 프로그램에서 자식 프로세스가 호출하는 프로그램'getpid()'를 사용하여 새로운 pid_t를 설정했다. –
아니요. 예를 든 자녀의 PID는 3077입니다. 부모의 PID를 인쇄하는 것을 본 적이 없습니다. –