gpt4 book ai didi

可以在 posix_spawn 的 argv 中传递字符串文字吗?

转载 作者:太空狗 更新时间:2023-10-29 17:24:06 25 4
gpt4 key购买 nike

对于 the posix_spawn function它的原型(prototype)是:

int posix_spawn(pid_t *restrict pid, const char *restrict path,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *restrict attrp,
char *const argv[restrict], char *const envp[restrict]);

值得注意的是,argv 参数指向一个 char * 指针数组(即指向可变字符的指针)。此外,该文档似乎并不能保证数据不会被写入。

我的问题是:是否可以保证某处可以传递字符串文字?还是我们冒着段错误的风险?

示例代码:

char *v[] = { "foo.exe", "bar", NULL };
posix_spawn( NULL, "foo.exe", NULL, NULL, v, NULL );

最佳答案

在这里使用字符串文字非常好。

指针参数(或参数指向的指针数据)是否指向 const 限定类型与函数是否可以修改指向的对象无关。这纯粹是相关功能的契约问题。作为惯例,当对象不会被修改时,通常最好在参数中使用 const 限定的指针:

  1. 允许在不强制转换的情况下将指针传递给 const 限定的对象,并且
  2. 表示对象不会被修改。

但是在C语言中没有要求这样做。对于在其接口(interface)中使用双指针类型的函数,这里通常需要权衡。由于 T *const T * 不能互为别名,接口(interface)必须选择调用者更可能需要的形式;如果调用者想要其他形式,它必须制作一个临时副本以传递给函数。 posix_spawn 就是这种情况。

一般来说,当涉及到标准函数(C 或 POSIX)时,它们除了指定之外不能有任何可观察到的副作用。除非函数的描述说明它将修改一个“属于”应用程序的对象,或者应用程序可以访问该对象,否则它不能修改它;这样做是不合格的。这就是为什么返回指向静态存储的指针的函数明确记录了它。例如,strerror 的 POSIX 文档:

The returned string pointer might be invalidated or the string content might be overwritten by a subsequent call to strerror(),

缺少此类文档,应用程序可以假设 strerror 返回的字符串从未被实现修改。

由于 posix_spawn 没有记录修改其 argv 数组指向的字符串,因此它不会修改它们。

此外,请注意 posix_spawn 必须是线程安全的,并且不会对应用程序并发访问 argv 字符串施加任何明确的约束。因此,任何修改都会引入数据竞争,从而导致 posix_spawn 非线程安全,这与规范相反。

关于可以在 posix_spawn 的 argv 中传递字符串文字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50596439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com