") { //convert strings to char*s char* conversion = new cha-6ren">
gpt4 book ai didi

c++ - 系统调用 open() 创建可执行文件

转载 作者:太空宇宙 更新时间:2023-11-04 10:56:05 25 4
gpt4 key购买 nike

if(cmds.at(i)==">")
{
//convert strings to char*s
char* conversion = new char[cmds.at(i-1).size()+1];
copy(cmds.at(i-1).begin(),cmds.at(i-1).end(),conversion);
conversion[cmds.at(i-1).size()] = '\0';
const char * out_file_cstring = cmds.at(i+1).c_str();

//count and agregate arguments
int size = count_arguments(conversion);
size++;
char** args= new char*[size];//dont forget to delete
args[0] = strtok(conversion," \n");
for(int j = 1; j<size; j++){args[j] = strtok(NULL, " \n");}
args[size-1]= NULL;

//forking and redirection
int out_file = open(out_file_cstring,O_CREAT|O_WRONLY|O_TRUNC);
pid_t pid = fork();
if(!pid)
{
dup2(out_file,STDOUT_FILENO);
close(out_file);
int r = execvp(args[0],args);
if(r<0)
{
cerr<<"ERROR : exec failed"<<args[0]<<endl;
return false;
}
}

所以我的代码正确地创建并写入了 out_file。但是,由于某种原因,该文件是可执行文件。我认为错误出在我的 open() 调用中,但我似乎找不到原因。

最佳答案

man 2 open 解释原因:

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

O_CREAT:
If the file does not exist it will be created. [...]
The permissions of the created file are (mode & ~umask).

所以如果你想要一个不可执行的文件,你可以使用:

open(out_file_cstring,O_CREAT|O_WRONLY|O_TRUNC, 0666);

0666 将建议所有读/写(相当于常量标志 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH),用户的 umask 将进一步将最终权限限制为用户选择的默认值。

关于c++ - 系统调用 open() 创建可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28682507/

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