C 文件只能由root用户打开..我猜是授予了错误的权限

C 文件只能由root用户打开..我猜是授予了错误的权限,c,linux,system-calls,file-handling,C,Linux,System Calls,File Handling,我的程序基本上运行一个带有命令行参数的可执行文件。 子进程被分叉,并且子进程的输出在文件“filename”中 问题在于生成了文件并写入了数据,但它只能由root用户打开如何使调用该程序的用户可读? 代码是: #include<stdio.h> #include<string.h> //strcpy() used #include<malloc.h> //malloc() used #include<u

我的程序基本上运行一个带有命令行参数的可执行文件。 子进程被分叉,并且子进程的输出在文件“filename”中

问题在于生成了文件并写入了数据,但它只能由root用户打开如何使调用该程序的用户可读?

代码是:

    #include<stdio.h>
    #include<string.h>      //strcpy() used
    #include<malloc.h>      //malloc() used
    #include<unistd.h>      //fork() used
    #include<stdlib.h>      //exit() function used
    #include<sys/wait.h>    //waitpid() used
    #include<fcntl.h>

    int main(int argc, char **argv)
    {
char *command;
char input[256];
char **args=NULL;
char *arg;
int count=0;
char *binary;
pid_t pid;
int fdw;

printf("Enter the name of the executable(with full path)");
fgets(input,256,stdin);

command = malloc(strlen(input));
strncpy(command,input,strlen(input)-1);

binary=strtok(command," ");
args=malloc(sizeof(char*));

args[0]=malloc(strlen(binary)+1);
strcpy(args[0],binary);

while ((arg=strtok(NULL," "))!=NULL)
{
    if ( count%10 == 0) args=realloc(args,sizeof(char*)*10);
    count++;
    args[count]=malloc(strlen(arg));
    strcpy(args[count],arg);
}
args[++count]=NULL;

if ((fdw=open("filename",O_WRONLY|O_EXCL|O_CREAT|0700)) == -1)
    perror("Error making file");
close(1);
dup(fdw);

if ((pid = fork()) == -1)
{
    perror("Error forking...\n");
    exit(1);
}
if (pid == 0)   execvp(args[0],&args[0]);
else
{
    int status;
    waitpid(-1, &status, 0);
}
return 0;
}
#包括
#包含使用的//strcpy()
#包括使用的//malloc()
#include//fork()已使用
#使用的include//exit()函数
#使用的include//waitpid()
#包括
int main(int argc,字符**argv)
{
char*命令;
字符输入[256];
字符**args=NULL;
char*arg;
整数计数=0;
字符*二进制;
pid_t pid;
int fdw;
printf(“输入可执行文件的名称(带有完整路径)”;
fgets(输入,256,标准输入);
命令=malloc(strlen(输入));
strncpy(命令,输入,strlen(输入)-1);
二进制=strtok(命令“”);
args=malloc(sizeof(char*));
args[0]=malloc(strlen(二进制)+1);
strcpy(args[0],二进制);
而((arg=strtok(NULL,“”)!=NULL)
{
如果(计数%10==0)args=realloc(args,sizeof(char*)*10);
计数++;
args[count]=malloc(strlen(arg));
strcpy(args[count],arg);
}
args[++count]=NULL;
如果((fdw=open(“filename”,O|u WRONLY | O|u EXCL | O|u CREAT | 0700))=-1)
perror(“错误生成文件”);
关闭(1);
dup(fdw);
如果((pid=fork())=-1)
{
perror(“错误分叉…\n”);
出口(1);
}
如果(pid==0)execvp(args[0],&args[0]);
其他的
{
智力状态;
waitpid(-1,状态为0(&S);
}
返回0;
}

重新读取要打开的手册页,您没有正确传递文件模式参数,并导致标记在过程中出错。

重新读取要打开的手册页,您没有正确传递文件模式参数,并导致标记在传递过程中出错。

指向文件时ls-l会说什么?----xr--1 shadyabhi shadyabhi 7342 2010-02-03 01:39文件名指向文件时ls-l会说什么?----xr--1 shadyabhi shadyabhi 7342 2010-02-03 01:39文件名刚刚更改了open()调用:-open(“filename”,O_WRONLY | O_EXCL | O_CREAT,777)&问题解决了……不要使用777;那是十进制数,不是八进制数。不要使用0777;该文件不打算是可执行的,并且可能也不应该是全世界可写的。使用0644甚至0444(或者如果你信任属于你团队的其他人,可能使用0664)。@Shadyabhi:或者如果你不喜欢八进制常量,则使用符号名,例如
S|IRUSER | S|IRGRP | S|IWGRP | S|IROTH
。非可执行文件的最佳模式值为
0666
S|irsr | S|iwur | S|IRGRP | S|IWGRP | S| S|IROTH | S|IWOTH
。提供的模式与用户的umask相结合,以获得最终的权限位。在每个用户都有一个专用组的系统上,默认的umask通常是
0002
,当有单个用户组时,它通常是
0022
。最后的权限分别是
0664
0644
。通常,为用户组和其他组指定相同的位,以便用户可以控制最终权限。有关更多详细信息,请参阅umask(2)手册页()。确定。我得到你了。我不应该用它。。。刚才把open()调用改为:-open(“filename”,O_WRONLY | O_EXCL | O_CREAT,777)&问题已经解决了……不要使用777;那是十进制数,不是八进制数。不要使用0777;该文件不打算是可执行的,并且可能也不应该是全世界可写的。使用0644甚至0444(或者如果你信任属于你团队的其他人,可能使用0664)。@Shadyabhi:或者如果你不喜欢八进制常量,则使用符号名,例如
S|IRUSER | S|IRGRP | S|IWGRP | S|IROTH
。非可执行文件的最佳模式值为
0666
S|irsr | S|iwur | S|IRGRP | S|IWGRP | S| S|IROTH | S|IWOTH
。提供的模式与用户的umask相结合,以获得最终的权限位。在每个用户都有一个专用组的系统上,默认的umask通常是
0002
,当有单个用户组时,它通常是
0022
。最后的权限分别是
0664
0644
。通常,为用户组和其他组指定相同的位,以便用户可以控制最终权限。有关更多详细信息,请参阅umask(2)手册页()。确定。我得到你了。我不应该用它。。。谢谢你指出这一点。