Краткое содержание программы
Программа при выборе флага –а выводит на экран имя домашней директории, при выборе флага –b выводит на экран имя терминала. После чего сохраняет информацию в файл, под названием указанным пользователем
Программа может выполняться двумя разными способами: через функцию библиотеки, и через системные вызовы.
Код программы
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
int main(int argc, char*argv[])
{
int t;
int c;
int aflag=0;
int bflag=0;
int errflag=0;
int flag='?';
char*ofile=NULL;
opterr=0;
if (argc!=4)
{ printf("Использование:%s:[-a|-b][-o файл вывода]\n",argv[0]);
return 1;
}
while((c=getopt(argc,argv,":abo:"))!=-1)
{
switch(c)
{
case 'a':aflag++;
flag=c;
if(bflag)
{
printf("Опции a и b несовместимы\n");
errflag++;
}
break;
case 'b':bflag++;
flag=c;
if(aflag)
{
printf("Опции a и b несовместимы\n");
errflag++;
}
break;
case 'o':ofile=optarg;
break;
case':':printf("Отсутствует аргумент опции -%c\n",optopt);
errflag++;
break;
}
}
if(errflag)
{(void)printf("Использование:%s:[-a|-b][-o файл выхода]\n",argv[0]);
return(1);
}
printf("Заданный флаг:%c\n",flag);
printf("Аргумент опции o: %s\n",ofile);
printf("Остаток командной строки: ");
char pr;
printf("Каким способом Вы хотите выполнить лабу?");
printf("Вы хотите воспользоваться функцией библиотеки [m] /Вы хотите воспользоваться системными вызовами [g] \n");
scanf("%c", &pr);
if (pr=='m')
{
for (;optind<argc;optind++)
{
printf("%s",argv[optind]);
}
printf("\n");
{
int outfile;
char buf[100];
switch(flag)
{
case 'a':
printf("\n");
system("echo 'Imya directorii v kotoroy okazivaetsya koristuva4 posle zapuska v sistemu: ';cd; pwd");
sprintf (buf,"pwd > %s",argv[optind-1]);
system(buf);
break;
case 'b':
system("echo 'Imya terminala: '; tty");
sprintf(buf,"tty > %s",argv[optind-1]);
system(buf);
break;
}
}
}
else
{
for (;optind<argc;optind++)
{
printf("%s",argv[optind]);
}
printf("\n");
char * var;
char buf[100];
switch(flag)
{
case 'a':
var=getenv ("HOME");
printf("Адресс домашней директории:%s\n",var);
sprintf(buf,"Адресс домашней директории:%s\n",var);
break;
case 'b':
var=getenv ("TERM");
printf("Имя терминала:%s\n",var);
sprintf(buf,"Имя терминала:%s\n",var);
break;
}
char t;
int outfile;
outfile=open(argv[optind-1],O_RDWR,0644);
if (outfile!=-1)
{
printf("\nФайл уже существует! \n Добавить текущую информацию в конец файла(если да нажмите [c]? \n Перезаписать? [r]");
scanf("%c",&t);
scanf("%c",&t);
if (t=='y')
lseek(outfile,0,SEEK_END);
}
else if (outfile==-1)
outfile=open(argv[optind-1],O_RDWR|O_CREAT,0644);
write(outfile,buf,100);
{
printf("\n");
close(outfile);
}
}
return (0);
}
Скриншоты
Выводы
Приобрел навыки работы с командной строкой, с файлами и с переменными среды окружения Linux.
В частности научился использовать uname, sysinfo и функции getenv и system.
Функция system передает заданную строку string к интерпретатору команд и обрабатывает эту строку как команду Linux.