Я пытаюсь использовать clone () для создания дочернего процесса для exec () некоторых программ.Я знаю, что exec () заменяет исходный процесс, и процесс, который его вызывает, должен заканчиваться этим, поэтому я использую дочерний процесс для вызова exec ().Однако, по некоторым причинам, после exec () мой родительский процесс также падает.Может кто-нибудь сказать мне, почему это происходит?(если я заменю клон на форк или vfork, это сработает)
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sched.h>
void delNL(char * arry){ //A function to delete the newline at the end of the array
char * position;
position = strchr(arry,'\n');
*position = '\0';
}
int mySysC(char * command){ //clone funtion
char *cmd[10]={" "};
int nb=0;
int cnb=0;
while(command[nb]!='\0'){
char coa[10];
int cici=0;
while(command[nb]!=' ' && command[nb]!='\0'){
coa[cici]=command[nb];
nb++;
cici++;
}
coa[cici]='\0';
char *nad=(char *)malloc(10);
strcpy(nad,coa);
cmd[cnb]=nad;
cnb++;
if(command[nb]==' '){
nb++;
}
}
cmd[cnb]=NULL;
execvp(cmd[0],cmd);
exit(0);
}
void my_system_c(char * command){ //clone version
void * stack = (void *)malloc(10000);
void * stackTop = stack + 100000;
pid_t pid = clone((void *)mySysC(command),stackTop,CLONE_THREAD,NULL); //clone
waitpid(pid,NULL,0);
}
int main(){
char commdd[100];
char ex[10]="os_exit";
while(1){
printf("Please enter your command or enter \"os_exit\" to exit:\n");
fgets(commdd,100,stdin);
delNL(commdd);
if(strlen(commdd)>0 && strcmp(commdd,ex)!=0){
my_system_c(commdd); //select version
}
else if(strcmp(commdd,ex)==0) break;
else printf("Empty command\n");
}
return 0;
}
execvp (cmd [0], cmd);это то, что разбил всю программу.Я добавляю два отпечатка один до и один после, последний никогда не запускается.Я не понимаю, потому что я думал, что клон работает так же, как fork, который создает новый процесс, и конец процесса chile не повлияет на родительский?
Спасибо !!!