这个程序应该使用一个文件名和参数,并创建一个执行代码的进程,同时将结果输出到终端(我也不知道这是为什么)。
我发现seg错误来自于我试图释放字符串的argvNew数组。
#include <iostream>
using namespace std;
#include <unistd.h>
#include <sys/wait.h>
main(int argc, char **argv){
int pid;
int i;
char *argvNew[argc-1];
do{
//Check for failure
if ((pid = fork()) < 0) {
cerr << "Fork error\n";
exit(1);
}
//Check if parent
else if (pid == 0) {
/* child process */
//Add arguments to new array
for(i = 0; i < argc-2; i++){
argvNew[i] = argv[i+1];
}
argvNew[argc-2] = NULL;
if (execvp(argv[1], argvNew) < 0) {
cerr << "Execve error\n";
exit(1);
}
}
else {
/* parent */
waitpid(pid, NULL, 0);/* wait for the child to finish */
//Free argvNew
for(i = 0; i < argc-1;i++){
free(argvNew[i]);
}
free(argvNew);
}
//if we're need to create a new list of args in the future put it here
}while(!argc);
}测试输入:./myProgram /bin/ls -l
发布于 2016-08-30 23:24:29
argvNew是自动分配的,这意味着当它超出作用域时,它所持有的资源会自动释放。您只需要free动态分配的数组:
char a[50]; // the [50] means automatic allocation
// ...
// no need to freechar* a = malloc(50); // dynamic allocation
// ...
// need to free later, or memory leak
free(a);发布于 2016-08-30 23:30:09
for(i = 0; i < argc-1;i++){
free(argvNew[i]);
}
//This next call is identical to free(argvNew[0]), probably where you're
//segfaulting, since you're freeing something twice
free(argvNew);请注意,您不需要调用free(),因为argvNew[]包含的指针不指向新的/malloc‘ed数据,而是指向argv数组的值,这些值由父进程管理,不应该由您显式地释放()。
https://stackoverflow.com/questions/39238486
复制相似问题