在我的代码中,我有以下片段:
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代码:
#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版.
这里有更多的代码,因为我遇到了我现在修复的主要程序的问题.
我有一个修改一系列字节的函数.在这个例子中,该函数应该连续地填充数字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
我目前有一个网站,客人可以使用任意数量的斜杠访问每个网址,以分隔文件夹名称.例如,如果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组合我可以用来剥去中间斜线或者它更复杂?
我创建了简单的代码来测试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()无法正确执行?
什么是绝对最好的功能,与我可以用来代替睡眠的所有系统兼容?