Sunteți pe pagina 1din 4

Problema pipe a 2-a problema generala pt examen!Procesul parinte trimite “GASIT” inapoi.!

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <dirent.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
void handlerkill(int sig)
{
(void)signal(SIGKILL, handlerkill);
kill(pid,SIGKILL);
}
void functie(char fisier[256], char cr)
{
int pipeFT[2];
int pid;
int rv;
int status;
char buff[256];
char c;
FILE *f,*f1,*f2;

pipe(pipeFT);
pid = fork();

if(pid == -1)
{
perror("fork");
exit(1);
}

if (pid == 0) { // proces FIU

close(pipeFT[1]);
f = fopen(fisier, "r");
while(rv = read(f, &buff, 1024))
write(pipeFT[0], &buff, rv);

fclose(f);
close(pipeFT[0]);
}
else{ // poces TATA

close(pipeFT[0]);
f1 = fopen(pipeFT[1], "r");
f2 = fopen("aux.txt", "w");
while (fgets(&buff, 100, f1) != NULL)
fprintf(f2, "%s", &buff);

while((c=fgetc(f2))!=EOF)
if(c==cr)
{
printf("GASIT!!!");
signal(SIGKILL, handlerkill);
}
waitpid(-1, &status, 0);

}
}

int main()
{
char caracter;
char fis[256];
printf("\nInroduceti cale fisierului si fisierul:\n");
scanf("%s", fis);
printf("\nIntroduceti caracteru pe care doriti sa-l cautati:\n");
scanf("%c", caracter);
functie(fis,caracter);
}
Alt model de problema

Scrieti un program C care parcurge recursiv un director dat ca parametru ( daca nu se da nici-un
parametru se va parcurge directorul curent) si afiseaza numele fisierelor a caror dimensiune nu
depaseste 100 de octeti. Daca fisierul este legatura simbolica se va afisa calea catre fisierul spre care
indica legatura simbolica.

#include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <dirent.h>
#include <unistd.h>
#include <string.h>
void findfiles(char *path) {
struct dirent *entry; //This structure will hold file information
struct stat file_status; //This structure will be used to query file status
DIR *dir = opendir(path); //This pointer references the directory stream

//Make sure we have a directory stream pointer


if (!dir) {
perror("opendir failure");
exit(1);
}

//Change directory to the given path


chdir(path);

//Loop through all files and directories


while ( (entry = readdir(dir)) != NULL) {
//Don't bother with the .. and . directories
if ((strcmp(entry->d_name, ".") != 0) && (strcmp(entry->d_name, "..") != 0)) {
//Get the status info for the current file
if (lstat(entry->d_name, &file_status) == 0) {
//Is this a directory, or a file?
if (S_ISDIR(file_status.st_mode)) {
//Call findfiles again (recursion), passing the new directory's
path
findfiles(entry->d_name);
chdir("..");
}
else {
//We've found a file, pack it into the resource file
if(file_status.st_size<=100)
if(S_ISLNK(file_status.st_mode))
{ printf("fisierul %s e legatura simbolica\n", entry->d_name);
char buf[1024];
ssize_t len;
if ((len = readlink(entry->d_name, buf, sizeof(buf)-1)) != -1){
buf[len] = '\0';
printf("numele fisierului referit de legatura simbolica este: %s\n",buf);
}
char buf2[1024];
ssize_t len2;
if (getcwd(buf2,sizeof(char)*1024)!=NULL){
len2=sizeof(buf2);
buf2[len2] = '\0';
printf("Path-ul curent este: %s\n",buf2);
}
strcat(buf2,"numele fisierului trebuie sa intre aici\n");
printf("Am gasit o legatura simbolica si afisez path-ul pana la ea: %s\n", buf2);
} else
printf("fisierul %s e altceva\n",entry->d_name);
}}}}//Make sure we close the directory stream
if (closedir(dir) == -1) {
perror("closedir failure");
exit(1);
} return;
}
int main(int argc, char *argv[])
{
if(argc!=2)
{printf("Eroare la numarul de argumente!");
exit(1);}
findfiles(argv[1]);}
/*

S-ar putea să vă placă și