2014-03-28 6 views
2

Я просмотрел этот сайт и другие и не смог найти ответ на мою вероятную элементарную проблему. Я нахожусь в AIX на работе и пытаюсь изучить системное программирование. Книга Стивенса немного в этом вопросе, и я не нашел хорошей «практической» книги по системному программированию.Использование fchmod в Unix

Это говорит о том, что я пытаюсь написать программу на языке C, которая в основном делает то, что сценарий (я называю «лечение») написал некоторое время назад. Вот простой сценарий (на данном этапе я не изменяю права пользователя/группы/других пользователей в полном объеме - я думал, что я ударил бы это препятствие, поэтому рекомендуется использовать самый простой способ сделать это):

## cure: changes permissions on all arguments to 777 

sudo chmod 777 $* 

Теперь вот мой cure.c код:

#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv) 
{ 
     int i, *fd; 
     //FILE *fd; 
     if(argc == 1) 
       printf("Usage: cure file1 file2 ...\n"); 

     for(i = 1 ; i < argc ; i++) 
     { 
       fd = fopen(argv[i], "rw"); 
       if(!fd) 
         printf("Cannot open %s\n", argv[i]); 
       fchmod(fd, S_IXUSR); 
       close(fd); 
     } 
     exit(0); 
} 

Я сделал некоторые настройки, пытаясь получить программу для работы. Как она стоит сейчас, вот предупреждающие сообщения, что НКУ печатает:

cure.c: В функции «главный»: cure.c: 15: 6: предупреждение: назначение из несовместимого типа указателя [включены по умолчанию ] cure.c: 18: 3: warning: Передача аргумента 1 из 'fchmod' делает целое число из указателя без cast [включено по умолчанию] /usr/include/sys/stat.h:330:13: note: ожидаемый 'int', но аргумент имеет тип 'int *' cure.c: 19: 3: warning: Передача аргумента 1 из 'close' делает целое число от указателя без cast [включено по умолчанию]/usr/include/unistd .h: 142: 12: примечание: ожидается 'int', но аргумент имеет тип 'int *

Если я изменить переменную Fd к не-указательного междунар, это то, что я получаю:

cure.c: В функции 'главный': cure.c: 15: 6: предупреждение: назначение делает целое число от указателя без приведения [по умолчанию включено]

Опять же, я понимаю, что это очень элементарно, так что есть некоторые понятия, которые я еще не получаю.

Благодаря

ответ

4

fopen возвращает FILE *, который представляет собой C поток абстракции. Вы можете использовать его так:

FILE *f = fopen(...); 

open возвращает дескриптор файла целочисленный, и вы можете использовать его так:

int fd = open(...); 

они разные функции и разные типы, и вы смешивая их.

Поскольку fchmod принимает дескриптор файла целое, вы хотите использовать основные open/close/целочисленный дескриптор файла семейство функций, неfopen/fclose/FILE* семейство функций.

+0

Большое спасибо, сэр! Я бы проголосовал за тебя, но я слишком скромный. – BWONG

+0

Нет проблем! Если это исправляет вашу проблему, вы сможете принять ее, даже если вы еще не можете проголосовать. – Useless

+0

Наконец-то получил репутацию, чтобы поддержать вас. Еще раз спасибо! – BWONG