2012-04-25 79 views
3

所以,我试图从它运行后台进程和execvp。 当我输入cp/path/file/var/tmp时,进程不复制文件。在C中的后台进程(守护进程)不execvp()-ing

这里是我的代码以供参考:

void cmd_bg(char command[]) 
{ 
     pid_t process_id = 0; 
     pid_t sid = 0; 
     char* argv[512]; 
     getArgv(command,argv); 
     // Create child process 
     process_id = fork(); 
     // Indication of fork() failure 
     if (process_id < 0) 
     { 
       printf("fork failed!\n"); 
       // Return failure in exit status 
       exit(1); 
     } 
     // PARENT PROCESS. Need to kill it. 
     if (process_id > 0) 
     { 
       printf("process_id of child process %d \n", process_id); 
       // return success in exit status 
       exit(0); 
     } 
     //unmask the file mode 
     umask(0); 
     //set new session 
     sid = setsid(); 
     if(sid < 0) 
     { 
       // Return failure 
       exit(1); 
     } 
     // Change the current working directory to root. 
     chdir("/"); 
     // Close stdin. stdout and stderr 
     close(STDIN_FILENO); 
     close(STDOUT_FILENO); 
     close(STDERR_FILENO); 


     execvp(argv[0],argv); 

     } 
} 
void getArgv(char command[], char* argv[512]) 
{ 
     char *token; 
     int count = 0; 
     int pid = 0; 
     int ex = 0; 
     char *absPath; 
     char pwdtemp[512]; 
     strcpy(pwdtemp,pwd); 

     token = strtok(command, " "); 
     while(token!=NULL) 
     { 
       argv[count++] = token; 
       printf("%s\n",argv[count-1]); 
       token = strtok(NULL," "); 
     } 
     argv[count] = '\0'; 
} 

我真诚地希望有人能帮助我。谢谢!

编辑:我找到了解决方法。我不能自己回答,因为我没有100分钱。 对于未来人们来说,任何人都可以看到这根线:

好的。我解决了这个问题。

首先我注释掉

close(STDIN_FILENO); 
close(STDOUT_FILENO); 
close(STDERR_FILENO); 
chdir("/"); 

下,而不是直接调用cmd_bg,我创建:

void temp1(char command[]) 
{ 
    int pid = fork(); 
    if(pid==0) 
     cmd_bg(command); 

    else 
     waitpid(-1, NULL, 0); 
} 

似乎现在的工作!谢谢你的投入!

+0

请将内部代码的相关部分内联,而不是外部网站上。 – 2012-04-25 12:44:53

+0

好的。抱歉。完成! – Ishwar 2012-04-25 12:47:47

+0

仍然不完整。 main()在哪里? “pwd”在哪里定义? ...和'argv [count] ='\ 0';'应该是'argv [count] = NULL;' – wildplasser 2012-04-25 12:51:10

回答

0

你有没有尝试,但不关闭标准输入,标准输出,标准错误

+0

试过:(仍然不能正常工作 – Ishwar 2012-04-25 12:23:59

0

我会检查,看看是否execvp回报(它只返回出错),看看有什么错误号它产生。这可以帮助你追踪这个问题。

+0

我在想同样的事情,但是如何跟踪过程是什么时候没有与我的shell进行交互?(因为它的分离) – Ishwar 2012-04-25 12:32:05

+0

对不起,请问如果它是一个简单的问题,我是C新手,我是一个JAVA人! – Ishwar 2012-04-25 12:32:39

+0

如果你的系统有syslog(linux应该),你可以尝试包括syslog.h和调用系统日志,你的日志记录将(可能)被追加到/ var/log/messages的末尾 – 2012-04-25 12:33:37

0

你有什么机会叫你的程序cp?如果是这种情况,您execvp()将一遍又一遍地调用该程序,而不是/bin/cp。它也将有助于获得完整的代码。

+0

Inte休息!但是没有我的程序不叫做cp! – Ishwar 2012-04-25 13:13:34