我的意思是询问在调用execve
家族时字符串的保存。来自OSTEP Chp.4:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main (int argc, char *argv[]) {
...
int rc = fork();
...
if (rc == 0) {
char *myargs[3];
myargs[0] = strdup("wc");
myargs[1] = strdup("p3.c");
myargs[2] = NULL;
execvp(myargs[0], myargs);
}
我将...
表示为与我的问题无关。我想问一下这里的代码。据我所知,C将myargs
设置为wc
的主函数的char *argv[]
。我想了解与字符串字面量有关的概念。据我所知,C标准允许argv
的可变性。例如:
int main (int argc, char *argv[]) {
argv[0][2] = 'd';
}
然而,我想知道当这些字符数组是固定长度时,如何保证这一点。另外,为什么要调用strdup()
?据我所知,这将堆分配字符串,允许它发生变化,所以在调用execvp()
时,这是必要的吗?
myargs[0] = "wc";
是否可以接受?
1条答案
按热度按时间m528fe3b1#
OSTEP Chp.4:
该链接中的章节标记为5,而不是4。
然而,我想知道当这些字符数组是固定长度时,如何保证这一点。
C标准规定程序可以修改
argv
所指向的字符串的内容。(并且包括)空字符。因此,程序可以修改那些字符。因此,它只保证在程序启动时可以使用字符串中的字节。不能保证它可以使字符串更长或使用空字符以外的任何字节。为什么要调用
strdup()
?因为作者不知道或忽略了这样一个事实,即它是没有必要的。
在调用
execvp()
...时是否需要此功能?不会,
execvp
会采取措施确保传递给它的字符串对新程序可用。调用execvp
的程序不需要复制。我的意思是询问在调用
execve
家族时字符串的保存。u8
,u
,U
或L
,如"abc"
或u8"def"
。string literal是源代码中的字符,"abc"
,包括引号。它不是程序中创建的字符“abc”。当程序被编译时,编译器创建由字符串字面量表示的字符串(在C标准使用的计算模型中)。结果字符串仅仅是一个字符串;与不是来自字符串字面量的字符串相比,它没有什么特别之处,除了C标准不保证它可以被修改。2有些人称结果字符串为字符串字面量,但这是语言的一个稍微草率的使用。传递给
execvp
的字符串是否来自字符串文字,或由程序以某种方式构造,或从输入中读取,或具有自动,静态或动态分配的存储持续时间与execvp
无关。