/* main program illustrating the UNIX fork() system call.
Compile using cc -o main main.c
*/
#include <stdio.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
pid_t pid1 = 0, pid2 = 0, pid3 = 0, pid4 = 0, pid5 = 0, pid6 = 0;
pid1 = fork();
printf("pid1 has been executed!"); if (pid1 == 0) { // Child process
pid2 = fork();
printf("pid2 has been executed!"); printf("Process %d created, Parent: %d\n", getpid
(), getppid
()); } else { // Parent process executes execvp
char *args[] = {"/bin/ls", NULL};
execvp(args[0], args);
}
printf("Process %d created, Parent: %d\n", getpid
(), getppid
()); pid3 = fork();
if (pid4 != 0) { // Parent process
printf("Process %d created, Parent: %d\n", getpid
(), getppid
()); char *args[] = {"/bin/ls", NULL};
execvp(args[0], args);
} else { // Child process
if (pid1 != 0) { // If this is not the first child
pid5 = fork();
printf("Process %d created, Parent: %d\n", getpid
(), getppid
()); char *args[] = {"/bin/ls", NULL};
execvp(args[0], args);
}
}
if (pid2 > 0) { // Only for the original parent process
pid6 = fork();
printf("Process %d created, Parent: %d\n", getpid
(), getppid
()); } else { // pid2 == 0 case
printf("Process %d created, Parent: %d\n", getpid
(), getppid
()); char *args[] = {"/bin/ls", NULL};
execvp(args[0], args);
}
printf("Process %d created, Parent: %d\n", getpid
(), getppid
());
return 0;
}
LyogICAgbWFpbiBwcm9ncmFtIGlsbHVzdHJhdGluZyB0aGUgVU5JWCBmb3JrKCkgc3lzdGVtIGNhbGwuIApDb21waWxlIHVzaW5nIGNjIC1vIG1haW4gbWFpbi5jCiovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgppbnQgbWFpbigpIHsKICAgIHBpZF90IHBpZDEgPSAwLCBwaWQyID0gMCwgcGlkMyA9IDAsIHBpZDQgPSAwLCBwaWQ1ID0gMCwgcGlkNiA9IDA7CgogICAgcGlkMSA9IGZvcmsoKTsKICAgIHByaW50ZigicGlkMSBoYXMgYmVlbiBleGVjdXRlZCEiKTsKICAgIGlmIChwaWQxID09IDApIHsgIC8vIENoaWxkIHByb2Nlc3MKICAgICAgICBwaWQyID0gZm9yaygpOwogICAgICAgIHByaW50ZigiQSIpOwogICAgICAgIHByaW50ZigicGlkMiBoYXMgYmVlbiBleGVjdXRlZCEiKTsKICAgICAgICBwcmludGYoIlByb2Nlc3MgJWQgY3JlYXRlZCwgUGFyZW50OiAlZFxuIiwgZ2V0cGlkKCksIGdldHBwaWQoKSk7CiAgICB9IGVsc2UgeyAgLy8gUGFyZW50IHByb2Nlc3MgZXhlY3V0ZXMgZXhlY3ZwCiAgICAgICAgY2hhciAqYXJnc1tdID0geyIvYmluL2xzIiwgTlVMTH07CiAgICAgICAgZXhlY3ZwKGFyZ3NbMF0sIGFyZ3MpOwogICAgfQoKICAgIHByaW50ZigiUHJvY2VzcyAlZCBjcmVhdGVkLCBQYXJlbnQ6ICVkXG4iLCBnZXRwaWQoKSwgZ2V0cHBpZCgpKTsKICAgIHByaW50ZigiQiIpOwogICAgcGlkMyA9IGZvcmsoKTsKICAgIGlmIChwaWQ0ICE9IDApIHsgIC8vIFBhcmVudCBwcm9jZXNzCiAgICAJcHJpbnRmKCJDIik7CiAgICAgICAgcHJpbnRmKCJQcm9jZXNzICVkIGNyZWF0ZWQsIFBhcmVudDogJWRcbiIsIGdldHBpZCgpLCBnZXRwcGlkKCkpOwogICAgICAgIGNoYXIgKmFyZ3NbXSA9IHsiL2Jpbi9scyIsIE5VTEx9OwogICAgICAgIGV4ZWN2cChhcmdzWzBdLCBhcmdzKTsKICAgIH0gZWxzZSB7ICAvLyBDaGlsZCBwcm9jZXNzCiAgICAgICAgaWYgKHBpZDEgIT0gMCkgeyAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGNoaWxkCiAgICAgICAgICAgIHBpZDUgPSBmb3JrKCk7CiAgICAgICAgICAgIHByaW50ZigiUHJvY2VzcyAlZCBjcmVhdGVkLCBQYXJlbnQ6ICVkXG4iLCBnZXRwaWQoKSwgZ2V0cHBpZCgpKTsKICAgICAgICAgICAgY2hhciAqYXJnc1tdID0geyIvYmluL2xzIiwgTlVMTH07CiAgICAgICAgICAgIGV4ZWN2cChhcmdzWzBdLCBhcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJEIik7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChwaWQyID4gMCkgeyAgLy8gT25seSBmb3IgdGhlIG9yaWdpbmFsIHBhcmVudCBwcm9jZXNzCiAgICAgICAgcGlkNiA9IGZvcmsoKTsKICAgICAgICBwcmludGYoIkUiKTsKICAgICAgICBwcmludGYoIlByb2Nlc3MgJWQgY3JlYXRlZCwgUGFyZW50OiAlZFxuIiwgZ2V0cGlkKCksIGdldHBwaWQoKSk7CiAgICB9IGVsc2UgeyAgLy8gcGlkMiA9PSAwIGNhc2UKICAgIAlwcmludGYoIkYiKTsKICAgICAgICBwcmludGYoIlByb2Nlc3MgJWQgY3JlYXRlZCwgUGFyZW50OiAlZFxuIiwgZ2V0cGlkKCksIGdldHBwaWQoKSk7CiAgICAgICAgY2hhciAqYXJnc1tdID0geyIvYmluL2xzIiwgTlVMTH07CiAgICAgICAgZXhlY3ZwKGFyZ3NbMF0sIGFyZ3MpOwogICAgfQogICAgCiAgICBwcmludGYoIkciKTsKCiAgICBwcmludGYoIlByb2Nlc3MgJWQgY3JlYXRlZCwgUGFyZW50OiAlZFxuIiwgZ2V0cGlkKCksIGdldHBwaWQoKSk7CgogICAgcmV0dXJuIDA7Cn0=