Linux 需要chmod系统调用的数值参数来仅更改粘性位

Linux 需要chmod系统调用的数值参数来仅更改粘性位,linux,file-permissions,system-calls,chmod,Linux,File Permissions,System Calls,Chmod,我知道如何直接从命令行使用chmod。但我不确定我们是否能模仿它 chmod o+t filename 功能。我通常直接称之为: chmod(filename, 0666) 但是我不想设置权限,而是想知道如何在不影响其他权限的情况下添加权限,比如chmod o+t filename。类似于chmod(filename,1777)的东西也会设置粘性位,但它也会设置所有其他位。我们应该将什么数字传递给chmod,让它只改变粘性位?提前感谢。如评论中所述,首先使用stat()读取当前模式位,然后

我知道如何直接从命令行使用
chmod
。但我不确定我们是否能模仿它

chmod o+t filename 
功能。我通常直接称之为:

chmod(filename, 0666)

但是我不想设置权限,而是想知道如何在不影响其他权限的情况下添加权限,比如
chmod o+t filename
。类似于
chmod(filename,1777)
的东西也会设置粘性位,但它也会设置所有其他位。我们应该将什么数字传递给
chmod
,让它只改变粘性位?提前感谢。

如评论中所述,首先使用stat()读取当前模式位,然后执行chmod()

你需要明白的是,你不应该直接使用数值,而应该信任头文件中定义的数值。有关可用的信息,请参见
man 2 chmod

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char **argv) {
  struct stat st;

  if(argc < 1) return 2;

  if(stat(argv[1], &st) != 0) {
    perror(argv[1]);
    return 2;
  }

  printf("mode before chmod() = %o\n", st.st_mode);

  if(chmod(argv[1], st.st_mode | S_ISVTX) != 0) {
    perror(argv[1]);
    return 1;
  }

  if(stat(argv[1], &st) != 0) {
    perror(argv[1]);
    return 2;
  }

  printf("mode after chmod() = %o\n", st.st_mode);

  return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
结构统计;
如果(argc<1)返回2;
如果(统计数据(argv[1],&st)!=0){
perror(argv[1]);
返回2;
}
printf(“chmod()之前的模式=%o\n”,st.st\u模式);
如果(chmod(argv[1],st.st|u模式| S|u ISVTX)!=0){
perror(argv[1]);
返回1;
}
如果(统计数据(argv[1],&st)!=0){
perror(argv[1]);
返回2;
}
printf(“chmod()之后的模式=%o\n”,st.st\u模式);
返回0;
}

享受家庭作业的乐趣

如注释中所述,首先使用stat()读取当前模式位,然后执行chmod()

你需要明白的是,你不应该直接使用数值,而应该信任头文件中定义的数值。有关可用的信息,请参见
man 2 chmod

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char **argv) {
  struct stat st;

  if(argc < 1) return 2;

  if(stat(argv[1], &st) != 0) {
    perror(argv[1]);
    return 2;
  }

  printf("mode before chmod() = %o\n", st.st_mode);

  if(chmod(argv[1], st.st_mode | S_ISVTX) != 0) {
    perror(argv[1]);
    return 1;
  }

  if(stat(argv[1], &st) != 0) {
    perror(argv[1]);
    return 2;
  }

  printf("mode after chmod() = %o\n", st.st_mode);

  return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
结构统计;
如果(argc<1)返回2;
如果(统计数据(argv[1],&st)!=0){
perror(argv[1]);
返回2;
}
printf(“chmod()之前的模式=%o\n”,st.st\u模式);
如果(chmod(argv[1],st.st|u模式| S|u ISVTX)!=0){
perror(argv[1]);
返回1;
}
如果(统计数据(argv[1],&st)!=0){
perror(argv[1]);
返回2;
}
printf(“chmod()之后的模式=%o\n”,st.st\u模式);
返回0;
}

享受家庭作业的乐趣

如注释中所述,首先使用stat()读取当前模式位,然后执行chmod()

你需要明白的是,你不应该直接使用数值,而应该信任头文件中定义的数值。有关可用的信息,请参见
man 2 chmod

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char **argv) {
  struct stat st;

  if(argc < 1) return 2;

  if(stat(argv[1], &st) != 0) {
    perror(argv[1]);
    return 2;
  }

  printf("mode before chmod() = %o\n", st.st_mode);

  if(chmod(argv[1], st.st_mode | S_ISVTX) != 0) {
    perror(argv[1]);
    return 1;
  }

  if(stat(argv[1], &st) != 0) {
    perror(argv[1]);
    return 2;
  }

  printf("mode after chmod() = %o\n", st.st_mode);

  return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
结构统计;
如果(argc<1)返回2;
如果(统计数据(argv[1],&st)!=0){
perror(argv[1]);
返回2;
}
printf(“chmod()之前的模式=%o\n”,st.st\u模式);
如果(chmod(argv[1],st.st|u模式| S|u ISVTX)!=0){
perror(argv[1]);
返回1;
}
如果(统计数据(argv[1],&st)!=0){
perror(argv[1]);
返回2;
}
printf(“chmod()之后的模式=%o\n”,st.st\u模式);
返回0;
}

享受家庭作业的乐趣

如注释中所述,首先使用stat()读取当前模式位,然后执行chmod()

你需要明白的是,你不应该直接使用数值,而应该信任头文件中定义的数值。有关可用的信息,请参见
man 2 chmod

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char **argv) {
  struct stat st;

  if(argc < 1) return 2;

  if(stat(argv[1], &st) != 0) {
    perror(argv[1]);
    return 2;
  }

  printf("mode before chmod() = %o\n", st.st_mode);

  if(chmod(argv[1], st.st_mode | S_ISVTX) != 0) {
    perror(argv[1]);
    return 1;
  }

  if(stat(argv[1], &st) != 0) {
    perror(argv[1]);
    return 2;
  }

  printf("mode after chmod() = %o\n", st.st_mode);

  return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
结构统计;
如果(argc<1)返回2;
如果(统计数据(argv[1],&st)!=0){
perror(argv[1]);
返回2;
}
printf(“chmod()之前的模式=%o\n”,st.st\u模式);
如果(chmod(argv[1],st.st|u模式| S|u ISVTX)!=0){
perror(argv[1]);
返回1;
}
如果(统计数据(argv[1],&st)!=0){
perror(argv[1]);
返回2;
}
printf(“chmod()之后的模式=%o\n”,st.st\u模式);
返回0;
}

享受家庭作业的乐趣

检索当前模式位,修改它们以设置粘性位,发出chmod()将新值写回文件系统。正如@keshlam所提到的,您应该使用stat()获得当前权限。然后,您可以按位或将粘性位写入现有权限。检索当前模式位,修改它们以设置粘性位,发出chmod()将新值写回文件系统。正如@keshlam所提到的,您应该使用stat()获取当前权限。然后,您可以按位或将粘性位写入现有权限。检索当前模式位,修改它们以设置粘性位,发出chmod()将新值写回文件系统。正如@keshlam所提到的,您应该使用stat()获取当前权限。然后,您可以按位或将粘性位写入现有权限。检索当前模式位,修改它们以设置粘性位,发出chmod()将新值写回文件系统。正如@keshlam所提到的,您应该使用stat()获取当前权限。然后,您可以按位或粘滞位访问现有权限。非常感谢。那么我该如何使用这个机制来取消设置呢?这有一个非常明显的争用条件-如果在调用
stat()
和调用
chmod()
之间,另一个进程调用文件
chmod()
?有原子解决方案吗?非常感谢。那么我该如何使用这个机制来取消设置呢?这有一个非常明显的争用条件-如果在调用
stat()
和调用
chmod()
之间,另一个进程调用文件
chmod()
?有原子解决方案吗?非常感谢。那么我该如何使用这个机制来取消设置呢?这有一个非常明显的争用条件-如果在调用
stat()
和调用
chmod()
之间,另一个进程调用文件
chmod()
?有原子解决方案吗?非常感谢。那么我该如何使用这个机制来取消设置呢?这有一个非常明显的争用条件-如果在调用
stat()
和调用
chmod()
之间,另一个进程调用文件
chmod()