Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ubuntu Linux中的C-无法执行分叉进程_C_Linux_Ubuntu_Fork_Exec - Fatal编程技术网

Ubuntu Linux中的C-无法执行分叉进程

Ubuntu Linux中的C-无法执行分叉进程,c,linux,ubuntu,fork,exec,C,Linux,Ubuntu,Fork,Exec,我正试图在UbuntuLinux中编写一个简单的C程序,它使用几个进程连接到共享内存,并从中读取/写入数据。一般顺序是: 运行进程1 进程1分配并连接到共享内存 流程1分叉为流程2 进程2执行,将共享内存ID作为命令行参数传递给“自身”,并在同一目录中运行新的二进制文件(DP-2) 进程2使用共享内存ID连接到共享内存 exec()调用给我带来了麻烦。我已经检查了进程1是否正确分配和连接到共享内存,是否正确分叉,以及进程2是否可以在分叉后连接到共享内存(从“进程1内部”)。但是,我似乎无法获

我正试图在UbuntuLinux中编写一个简单的C程序,它使用几个进程连接到共享内存,并从中读取/写入数据。一般顺序是:

  • 运行进程1
  • 进程1分配并连接到共享内存
  • 流程1分叉为流程2
  • 进程2执行,将共享内存ID作为命令行参数传递给“自身”,并在同一目录中运行新的二进制文件(
    DP-2
  • 进程2使用共享内存ID连接到共享内存
exec()
调用给我带来了麻烦。我已经检查了进程1是否正确分配和连接到共享内存,是否正确分叉,以及进程2是否可以在分叉后连接到共享内存(从“进程1内部”)。但是,我似乎无法获得启动新程序的
exec()
调用。相反,它只是停止并最终退出

整个代码分布在几个源文件中,有许多调试语句,因此我只包括处理
fork()
exec()
调用的部分

步骤1:获取共享内存ID。
SHAREDBUFFER
这是我正在使用的共享内存结构

shmID = shmget(shmkey, sizeof(SHAREDBUFFER), IPC_CREAT | 0660);
步骤2:将共享内存ID放入字符串数组中,以便将其传递给
exec()

步骤3:分叉并检查这是否是子进程。如果是这样,请使用步骤2中的命令行参数执行
DP-2
函数

forkReturn = fork();

if (forkReturn == FORK_FAILURE) {
    // handle the failure
}
else if (forkReturn == IS_CHILD) {
    execvp("DP-2", argv);
    exit(0);
}
// other code for parent process
补充说明:

  • 我知道当存储在
    argv
    中时,应该将
    shmID
    转换为字符串。我会尽快改变的

  • DP-2
    计划目前是一个
    hello world
    计划。它可以在没有命令行参数的情况下运行,我很确定问题不应该出在需要c字符串的地方给它一个整数

  • 我知道不同的
    exec()
    函数有不同的用途,但我相信
    execvp()
    应该很好地利用我提供的功能。我从一本在线指南中复制了这个特殊用法,但我真的不太理解它


DP-2是在路径中的目录中,还是与程序位于同一目录中?在后一种情况下:
/DP-2
DP-2
必须是
/DP-2
。除此之外,如果问题仍然存在,请尝试添加。进程1在分叉进程2之前连接到共享内存,而进程2是进程1在分叉之后和exec之前的副本。因此,在exec之前,进程2已经连接到共享内存。这使得您的断言“以及进程2在分叉后可以连接到共享内存(从“进程1内部”)的值可疑-分叉时它已经连接-但是
shmID
是从
shmget()
返回的数字。必须将其转换为字符串并将该字符串传递给进程。将一个典型的整数当作字符串传递会遇到问题-编译器应该向您尖叫,您不应该忽略它。请注意,如果
DP-2
与初始程序位于同一目录(
DP-1
?),则使用
execv()
而不是
execvp()
将在当前目录中毫无问题地执行程序-它将忽略
$PATH
中的值,只执行指定的文件。这可能是一个短期的解决办法;您可能最终想要使用
$PATH
来查找可执行文件。但它可以在短期内有效。还请注意,如果使用
/DP-2
,将忽略
$PATH
的设置;如果名称中有斜杠,则它是相对于当前目录的名称,并且未使用
$PATH
。是
DP-2
位于路径中的目录中,还是与程序位于同一目录中?在后一种情况下:
/DP-2
DP-2
必须是
/DP-2
。除此之外,如果问题仍然存在,请尝试添加。进程1在分叉进程2之前连接到共享内存,而进程2是进程1在分叉之后和exec之前的副本。因此,在exec之前,进程2已经连接到共享内存。这使得您的断言“以及进程2在分叉后可以连接到共享内存(从“进程1内部”)的值可疑-分叉时它已经连接-但是
shmID
是从
shmget()
返回的数字。必须将其转换为字符串并将该字符串传递给进程。将一个典型的整数当作字符串传递会遇到问题-编译器应该向您尖叫,您不应该忽略它。请注意,如果
DP-2
与初始程序位于同一目录(
DP-1
?),则使用
execv()
而不是
execvp()
将在当前目录中毫无问题地执行程序-它将忽略
$PATH
中的值,只执行指定的文件。这可能是一个短期的解决办法;您可能最终想要使用
$PATH
来查找可执行文件。但它可以在短期内有效。还请注意,如果使用
/DP-2
,将忽略
$PATH
的设置;如果名称中有斜杠,则它是相对于当前目录的名称,并且不使用
$PATH
forkReturn = fork();

if (forkReturn == FORK_FAILURE) {
    // handle the failure
}
else if (forkReturn == IS_CHILD) {
    execvp("DP-2", argv);
    exit(0);
}
// other code for parent process