Ubuntu Linux中的C-无法执行分叉进程
我正试图在UbuntuLinux中编写一个简单的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内部”)。但是,我似乎无法获
- 运行进程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
计划。它可以在没有命令行参数的情况下运行,我很确定问题不应该出在需要c字符串的地方给它一个整数hello world
- 我知道不同的
函数有不同的用途,但我相信exec()
应该很好地利用我提供的功能。我从一本在线指南中复制了这个特殊用法,但我真的不太理解它execvp()
/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