- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
对于 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 限定的指针:
但是在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/
目前我正在学习 C 并试图理解这些说明。它们真的不同吗? ++*argv *argv++ *(++argv) *(argv++) 谢谢! 最佳答案 后缀递增运算符的优先级高于指针取消引用运算符,而不是
我正在与在 Hostgator 共享主机上运行的 PHP CLI 的一个(也许)简单问题作斗争。一个简单的代码: 在我的本地机器上运行时以及其他几个 php 实例: php test.php arg
谁能解释一下原因 int main(int argc, const char * argv[]) { while (* argv) puts(* argv++); return 0 ;
从 K&R 的 C 书的第 5.10 章开始,argv 的概念被引入以允许命令行参数。 argv 是指向字符指针数组的指针。据此,以下代码如何检查提供的参数是否以连字符开头? (*++argv)[0]
我不明白 sys.argv 和 argv 之间的区别,网上没有任何东西给我我理解的概念。如果两者相同!我们什么时候使用 sys.argv 什么时候使用 argv ? 如果不是,sys.argv 是什么
我正在编写一个接受参数的 C 程序,char *argv[] 来决定运行哪个 exec()。我有 execlp(argv[1], argv[1], NULL) 可以正常工作。出于某种原因,execvp
char** argv 和 char* argv[] 有什么区别?在 int main(int argc, char** argv) 和 int main(int argc, char* argv[]
我目前有一个 python 脚本,可以在大型网络中完成一项非常有用的任务。我所做的是使用 lsof -iTCP -F 和其他一些选项来转储所有监听的 TCP 套接字。我能够得到 argv[0],这不是
为什么 argvs 的行为很奇怪?示例: 这将按预期工作,打印第一个参数的第一个字符。 printf("%c", *argv[1]); 但是,这将打印 ascii 表中的字符(又名“更大”,表示为数字
我做了一个小的重复异或加密器。您可以使用您选择的键对您选择的字符串进行异或运算,它可以选择将其输出到文件中。 无论何时使用单个单词(无空格)字符串和键运行程序,都没有问题。但是,只要字符串或键中有空格
我刚开始学习 C,想知道我应该在我的主要方法中使用其中的哪一个。有什么不同吗?哪个更常见? 最佳答案 由于您刚开始学习 C,我建议您首先真正尝试了解数组和指针之间的区别,而不是共同的东西。 在参数和数
所以我在编译器转换的函数中传递数组时在幕后阅读过 int myArray(int arr[]) 进入 int myArray(int *arr) 例如,大多数时候数组也会衰减为指针 arr[0] 与相
我正在编写一个小的 shell 程序,它接受一个命令并执行它。如果用户输入无效命令,则 if 语句返回 -1。如果命令正确,它就会执行命令,但是一旦它执行了命令,程序就会结束。我做错了什么是不执行它之
是否可以传入自定义参数列表? 与现实生活中的用例相比,更多是出于好奇,但例如,我可能希望在让 argparse 完成其工作之前将所有参数转换为小写。 最佳答案 Yes .只需传入要parse_args
我知道这个问题很基础,我也是新手,所以请帮我解决这个问题: 我有这个代码: int wmain(int argc, wchar_t *argv[]) { if (*argv[1] == L'-
这个问题在这里已经有了答案: Understanding slicing (38 个答案) 关闭 3 个月前。 我写了这段代码: #!/usr/bin/env python import sys i
我的程序获取主要参数,我的任务是检查用户是否在执行文件和参数之间输入了空格。 这是一个没有在 argv[0] 为 HW01 和 argv[1] 之间输入空格的人的例子/n: HW01/n 但是如果有人
我的 c 技能很生疏,所以如果这是一个愚蠢的问题,我深表歉意,但我什至没想过要寻找这个简单问题的答案。此代码编译时没有任何警告: #include int run_script( int argc,
这个问题在这里已经有了答案: Should I use char** argv or char* argv[]? (10 个答案) What does the 'array name' mean i
我有以下代码片段: int main(int argc, char *argv[]) { char line[MAXLINE]; long lineno = 0; i
我是一名优秀的程序员,十分优秀!