小编Mik*_*ike的帖子

尝试在C中创建具有所有权限的完整权限的文件

在我的代码中,我有以下片段:

char* filename="/something.txt";
umask(0);
int filehandle=open(filename,O_WRONLY|O_CREAT|0x777);
close(filehandle);
Run Code Online (Sandbox Code Playgroud)

执行它时,即使我完全按照文档操作,也会创建文件,但权限设置不正确.

文件说明:

参数模式指定在创建新文件时使用的权限.它以通常的方式由进程的umask修改:创建的文件的权限是(mode&~umask).

对于模式,我指定了0x777,这意味着读,写和执行.对于umask,我指定为零,因此0x777 & ~0应该导致777.

实际结果的权限是670.

为什么这样,我该如何解决?

c file-permissions file

3
推荐指数
1
解决办法
4287
查看次数

我可以在程序中使用常数而不将其存储在内存中吗?

这是我的C代码:

#include "stdio.h"
#define SIZE1 500;
int main(int argc,char* argv[]){
    unsigned long SIZE2=500;
    char astring2[SIZE2];
    char astring[SIZE1];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我删除包含"define"的行和包含的行,char astring[SIZE1];那么程序将很好地工作,但是内存中至少需要4个字节来存储数字500.

我希望看到的工作不起作用的是我删除这两行:

unsigned long SIZE2=500;
char astring2[SIZE2];
Run Code Online (Sandbox Code Playgroud)

当我编译上面的完整代码时,编译器给了我这些错误:

./teststring.c: In function 'main':
./teststring.c:6: error: expected ']' before ';' token
Run Code Online (Sandbox Code Playgroud)

这告诉我,它有SIZE1的问题.我也试过在SIZE1的值附近加上引号,但我仍然收到同样的错误.

有没有办法可以做到这一点,还是我被迫在内存中存储一​​个数字来使用它?

我不想在我的程序中随处输入相同的数字,所以请不要建议char astring[500]作为答案,但如果编译器在幕后为我编写,因为它将代码编译为可执行格式.

我的编译器是GCC 4.1.2版.

c gcc const

2
推荐指数
1
解决办法
64
查看次数

分段错误传递专门定义为字符串的地址

这里有更多的代码,因为我遇到了我现在修复的主要程序的问题.

我有一个修改一系列字节的函数.在这个例子中,该函数应该连续地填充数字1到9的char数组的前9个字节.

进行两项测试.第一个是调用参数所在的函数(char*)&myvar.第二个测试仅用myvar作参数.当我想要在函数的参数部分中返回的字符串时,我以为我总是必须在char数组指针前面使用&.

为什么这个程序只在我不(char*)&添加我的char数组变量时才有效?

当我应用它时,我收到分段错误.

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int func(char* abc){
    char *p=abc;
    int n;
    for (n=1;n<10;n++){
    *p=(unsigned char)(n+48);p++;
    }
    return 0;
}

int main(){
    char vars[1000]="234";
    char *myvar=vars;

    printf("Function test\n");
    int result=func((char*)&myvar); //causes segfault
    printf("Function result %s\n",myvar); //segfault here

    printf("Function test again\n");
    int result2=func(myvar);        //works
    printf("Function result %s\n",myvar);

    printf("DONE\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c arrays pass-by-reference segmentation-fault memory-address

1
推荐指数
1
解决办法
245
查看次数

在.htaccess中删除URL中的多个斜杠组

我目前有一个网站,客人可以使用任意数量的斜杠访问每个网址,以分隔文件夹名称.例如,如果URL应该是:

http://example.com/one/two/three/four
Run Code Online (Sandbox Code Playgroud)

然后,用户可以通过以下任何一种方式访问​​同一页面:

http://example.com/one//two///three////four/////
http://example.com/one/two////three/four/////
http://example.com///one///////////two////three/four/
http://example.com///////////one///////////two/three/four
Run Code Online (Sandbox Code Playgroud)

但是,我希望上面的示例网址仅将用户重定向到此网址:

http://example.com/one/two/three/four
Run Code Online (Sandbox Code Playgroud)

这是我的.htaccess文件,试图阻止巨大的斜杠:

RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteRule .* - [L]
RewriteRule ^(.*)/+$ /$1 [R=301,L,NC]
RewriteCond %{REQUEST_URI} ^/+(.*)/+$
RewriteRule .* /%1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

第三行成功停止长URL的尾部斜杠.第4行和第5行是我尝试在域名后立即停止斜杠,但这是不成功的.

我问这个问题的原因是因为我不希望谷歌抓住我的重复内容,并且在网站上有活跃的adsense,谷歌可能会扫描我访问的所有网址.

有没有RewriteCond/RewriteRule组合我可以用来剥去中间斜线或者它更复杂?

apache .htaccess mod-rewrite slash trailing-slash

0
推荐指数
1
解决办法
2297
查看次数

sleep()with float作为参数不起作用

我创建了简单的代码来测试sleep()函数.在C.

我尝试程序在终止前等待5秒后执行以下代码:

#include <stdlib.h>
#include <stdio.h>

int main(){
    int n=0;
    for (n=1;n<=10;n++){
        sleep(.5);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然而它等待说100毫秒.好吧,绝对不到一秒钟.

现在,如果我改为执行以下代码:

#include <stdlib.h>
#include <stdio.h>

int main(){
    int n=0;
    for (n=1;n<=10;n++){
        sleep(1);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

程序按预期运行(退出前等待10秒).

当参数是float时,为什么sleep()无法正确执行?

什么是绝对最好的功能,与我可以用来代替睡眠的所有系统兼容?

c floating-point sleep

-4
推荐指数
1
解决办法
262
查看次数