从execv运行mysql导入 pid\u t childPid=fork(); if(childPid==(pid_t)0)//零成功 { const char*path=“/usr/local/mysql/bin/mysql”; //不起作用 //char*const parmList[]={--user=root,“test_db”,NULL}; //行得通 char*const parmList[]={“,”--user=root”,“test_db”,NULL}; execv(路径,parmList); printf(“错误:\t工作失败。\n”); } 否则,如果(childPid

从execv运行mysql导入 pid\u t childPid=fork(); if(childPid==(pid_t)0)//零成功 { const char*path=“/usr/local/mysql/bin/mysql”; //不起作用 //char*const parmList[]={--user=root,“test_db”,NULL}; //行得通 char*const parmList[]={“,”--user=root”,“test_db”,NULL}; execv(路径,parmList); printf(“错误:\t工作失败。\n”); } 否则,如果(childPid,c,execv,C,Execv,使用execv导入sql转储时遇到问题。您可以看到,我无法使用第一个参数列表登录,但第二个参数列表工作正常。无论如何,如果我添加到参数列表中: pid_t childPid = fork (); if (childPid == (pid_t) 0)//zero success { const char *path = "/usr/local/mysql/bin/mysql"; //doesn't work //char * const parmList[] = {"--u

使用execv导入sql转储时遇到问题。您可以看到,我无法使用第一个参数列表登录,但第二个参数列表工作正常。无论如何,如果我添加到参数列表中:

pid_t childPid = fork ();
if (childPid == (pid_t) 0)//zero success
{
    const char *path = "/usr/local/mysql/bin/mysql";
    //doesn't work
    //char * const parmList[] = {"--user=root", "test_db", NULL};
    //does work
    char * const parmList[] = {"", "--user=root", "test_db", NULL};
    execv(path, parmList);
    printf("ERROR:\tFork failed.\n");   
}
else if (childPid < (pid_t) 0)// -1 failure
{
    /* The fork failed. */
    printf("ERROR:\tFork failed.\n");   
    return EXIT_FAILURE;
}
else
{
    while (true) {
        //stay alive
        sleep(1);
    }
}
printf("done");
exit(0);

char*const parmList[]={“,”--user=root”,“test_db”,“第一个
paramList
不正确,因为第一个元素应该是要执行的程序的文件名:

参数argv是指向以null结尾的字符串的字符指针数组。应用程序应确保此数组的最后一个成员是null指针。这些字符串应构成 新进程映像可用的参数列表。argv[0]中的值应指向与某个exec函数启动的进程关联的文件名


第一个
参数列表的输入重定向不正确,因为第一个元素应该是要执行的程序的文件名:

参数argv是指向以null结尾的字符串的字符指针数组。应用程序应确保此数组的最后一个成员是null指针。这些字符串应构成 新进程映像可用的参数列表。argv[0]中的值应指向与某个exec函数启动的进程关联的文件名


第二个参数的输入重定向效果更好,因为第一个参数应该是命令名。因此,MySQL开始读取第二个参数。您应该使用命令名(路径),而不是空字符串,但这通常无关紧要


您不能对
execv
使用重定向,因为这是一个shell功能,并且
execv
不运行shell。您可以执行
/bin/sh
,参数告诉它运行
mysql
,或者您可以使用
dup2
将stdin更改为您想要的任何格式。

第二个更好,因为第一个t参数应该是命令名。因此,MySQL从第二个参数开始读取。您应该使用命令名(路径),而不是空字符串,但这通常并不重要

您不能将重定向与
execv
一起使用,因为这是一个shell功能,并且
execv
不运行shell。您可以执行
/bin/sh
,参数告诉它运行
mysql
,或者您可以使用
dup2
将stdin更改为您想要的任何格式。

使用
popen()
改为启动mysql,然后自己将sql文件的内容写入进程。

使用
popen()
改为启动mysql,然后自己将sql文件的内容写入进程。

这是合法的(但非常奇怪)告诉
mysql
程序它被称为
--user=root
,但程序不会将其视为选项参数。它也是合法的(但相当奇怪)不通过提供空字符串来告诉程序它被调用了什么。如果程序查看其名称来决定它应该做什么,这可能很重要。如果一个程序根据其调用的名称设计为不同的行为,则可能会发生这种情况。(考虑到
cc
gcc
,它们是指向同一个可执行文件的链接;
c89
c99
是简单的脚本,而不是指向
gcc
的链接)这是合法的(但非常奇怪)告诉
mysql
程序它被称为
--user=root
,但程序不会将其视为选项参数。它也是合法的(但相当奇怪)不通过提供空字符串来告诉程序它被调用了什么。如果程序查看其名称来决定它应该做什么,这可能很重要。如果一个程序根据其调用的名称设计为不同的行为,则可能会发生这种情况。(考虑
cc
gcc
,它们是指向同一可执行文件的链接;
c89
c99
是简单的脚本,而不是指向
gcc
的链接)
char * const parmList[] = {"", "--user=root", "test_db", "<", "/Users/joelsaltzman/Desktop/dump.sql", NULL};