我正在使用execvp执行一些命令,如ls -l,who,cp -r。/ aaa。/ bbb等。一切正常,直到我尝试第二次执行相同的命令。例如,我会告诉你我使用的顺序:ls -l(一切都很好),谁(一切都很好),ls -l(坏地址)。这是我的代码:
if(strcmp(com_instr, "issuejob") == 0)
{
pid = fork();
if(pid < 0)
{
perror("Fork");
exit(1);
}
else if(pid == 0)
{
sleep(0.1);
//number of args
read(fd, &t_args, sizeof(int));
printf("t_args %d\n",t_args);
commands = malloc(t_args*sizeof(char *));
for(i=0; i<t_args; i++)
{
commands[i] = malloc(SIZE*sizeof(char));
}
for(i=0; i<t_args; i++)
{
read(fd, commands[i], SIZE);
}
//Receiving data from named-pipe
/*temp_run = run_node->next;
while(temp_run != NULL)
{
printf("jjjjjjjjjjjjjjjjjjjj %d",temp_run->job_id);
temp_run = temp_run->next;
}*/
printf("command %s\n", commands[0]);
execvp(commands[0], commands);
perror("execvp");
exit(1);
}
else if(pid > 0)
{
temp_run = run_node;
for(i=0; i<run_num; i++)
{
if(temp_run->next != NULL) temp_run = temp_run->next;
else break;
}
if((i <= run_num-1) && (wait_node->next == NULL))
{
temp_run->next = malloc(sizeof(run_list));
temp_run = temp_run->next;
saving_data_run(temp_run, j_id, line, 1, arg_num-1, pid);
printf("pid:%d\n",temp_run->pid);
++running;
send_data_for_exec(line, arg_num-1, fd);
}
else
{
temp_wait = wait_node;
while(temp_wait->next != NULL) temp_wait = temp_wait->next;
temp_wait->next = malloc(sizeof(wait_list));
saving_data_wait(temp_wait, j_id, line, 0, arg_num-1, pid);
wait_num++;
}
}
j_id++;
}
我使用命名管道在char **命令中传递我的args。 Args正确传递给char **命令,我用printf检查过。在execvp中,执行相同命令的次数是否有任何问题?提前谢谢!
答案 0 :(得分:0)
我担心你使用:
for(i=0; i<t_args; i++)
{
read(fd, commands[i], SIZE);
}
每次调用read时,都会从文件(或管道?)中读取大小字节。可能是您的文件构造正确,但我想知道您是否在这些读取命令中意外地插入了太多数据。
例如,如果您的文件/管道填充了以下内容:
2,'l','s','',' - ','l','\ 0',1,'c','d','\ 0',2,'l', 's','',' - ','l','\ 0'
SIZE#define'd为80,然后在第一次调用时你将2读入t_args,但是你的第一次读取可能会将剩下的数据用于命令[0]。第二次读命令[1] 没有数据。
从您的描述中不清楚您的数据是什么样的......在每次读取调用后,以字节为单位循环打印出来,以及读取的返回值可能是个好主意。通常,read会返回实际读取的字节数...您可以使用它来帮助理智地检查您的答案。
希望有所帮助, - J.