Das programm sollte mit drei Prozessen über ein Shellscript laufen,
ich habe aber einen Fehler drin, bei semop() bekomme ich invalid argument,
bin für jede hilfe dankbar
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include "header.h"
static int semid;
static struct sembuf semap;
int main(int argc, char** argv){
int sleep_time,i,g;
union semun arg;
arg.val=1;
if (argc!=3) {
perror("Falsche Parameteranzahl\n");
exit(-1);
}
sleep_time=atoi(argv[2]);
if((semid=semget(KEY,1,IPC_CREAT|IPC_EXCL |0666))!=-1){
if(semctl(semid,0,SETVAL,arg)==-1){
perror("semctl");
exit(-1);
}
}
for(i=0;i<ITERATIONS;i++){
semap.sem_num=0;
semap.sem_op=-1;
semap.sem_flg=0;
if(semop(semid,&semap,1)==-1){
perror("semop");
exit(EXIT_FAILURE);
}
/*KRITSCHER BEREICH START*/
for(g=0;g<ANZ_ZEICHEN;g++){
printf("%s",argv[1]);
fflush(NULL);
sleep(sleep_time);
}
printf("\n");
semap.sem_num=0;
semap.sem_op=1;
semap.sem_flg=0;
if((semop(semid,&semap,1))==-1){
perror("semop");
exit(EXIT_FAILURE);
}
/*KRITISCHER BEREICH ENDE*/
}
return EXIT_SUCCESS;
}
Hey, danke fuer eure Bemuehungen. Ich habe die Ursache ausfindig machen koennen und muss zu meiner Schande gestehen, dass es erstens sehr daemlich und zweitens nichts mit den threads zu tun hat. Es war ein Memory-Leak.
Im tatsaechlichen Programm hatte ich vor pthread_create ein strdup. Mit jeder Threaderzeugung wurde somit Speicher allokiert, der auch nach Beendigung des Threads nicht freigegeben wurde. Das hat das ganze Programm schrittweise verlangsamt.
Sorry Leute
ist gelöst, statt XSendEvent benutze ich jetzt XTestFakeButtonEvent,
ich nehme an dass Firefox aus Sicherheitsgründen keine Events von XSendEvent annimmt.
ok, ich fühl mich jetzt ein bisschen doof. soll ich einfach zwei pipes erzeugen, und dann den aufruf vom command-line-programm in der art "sftp<&[eingabe-pipe-nr]>&[ausgabe-pipe-nummer]" machen?
Wie CStoll richtig sagte, werden alle Variablen aus dem EP in den KP kopiert - DU hast also alle Werte die vor dem Fork zur Verfügung standen nach dem fork in beiden Prozessen. Nur wirkt sich (weil es eine Kopie ist) eine Änderung an diesen Werten eben nicht auf den anderen Prozess aus. Mit Sichtbarkeit im Sinne von Lookup und Namespaces hat das übrigens garnichts zu tun.
Weiterhin müsstest Du tatsächlich die Deskriptoren, die Du ins Kindprogramm retten willst, beim exec übergeben. Das ist nicht weiter problematisch, da Deskriptoren auch nur Zahlen sind. Meistens will man das aber garnicht, sondern leitet STDIN/STDOUT auf die geerbten Deskriptoren um. BTW: Willst Du andere Deskriptoren als STDIN/STDOUT/STDERR an einen mit exec gestarteten Prozess vererben, musst Du zunächst das Close-On-Exec Flag löschen, sonst gehen diese beim exec nämlich wie der Rest auch ins Speicher-Nirvana.
Wenn Du allerdings vorher weisst, welche Nummern Deine Desckriptoren haben werden, kannst Du im KP auch drauf zugreifen ohne sie im exec zu übergeben. Du könntest z.B. vor dem exec mit dup2(descriptor, 3) einen Deskriptor auf die 3 legen (0, 1 und 2 sind stdin/out/err), dann mit fcntl(3, F_SETFD, 0) das close-on-exec flag löschen und dann mit exec einen KP starten der den Deskriptor 3 benutzt.
Gut hab es mit fputs probiert, das problem ist dass man das password nicht automatisch eingeben kann hier den code:
#include <iostream>
#include <cstdlib>
#include <string>
#include <cmath>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
{
FILE *ftp = popen("ftp","w");
fputs("open 128.100.1.32\n",ftp);
fputs("anonymous\n",ftp);
cout << "test.." << endl;
sleep(5);
fputs(" \n",ftp);
fputs("cd doc\n",ftp);
fputs("get eta.Z\n",ftp);
pclose(ftp);
return 0;
}
wenn ich diesen code starte kommt es bis Password: wenn man dort dann einfach "enter" (da für anonymous kein pw nötig ist) eingibt dann führt er den rest richtig aus:
dcmaster@localhost ~/programming $ ./test
test..
Name (128.100.1.32:dcmaster): Please login with USER and PASS.
SSL not available
Password:
Hat da jemand eine lösung?
danke ruediger habs jetzt schnell hinbekommen mit dem XImage. speichere nun mein image in die Ximage struktur und dann funkts auch ganz schoen schnell!!!
mfg
--linuxuser--
im prinzip reicht fuer dein programm das einlesen der standardeingabe
int main(int argc, char *argv[])
{
int in= 0;
while ( ( in = getchar() ) != EOF ){
std::cout << "tu was mit " << in << "\n" ;
}
std::cout << std::endl;
return 0;
}
arecord wird aber nie ein eof liefern das musst du dir halt was ueberlegen, auch was ist wenn deine analyse der daten ein bissl langsam ist.
Hi!
Ich habe ein Programm geschrieben mit dem ich in C mit System Calls eine Datei lese und neu schreibe (also kopiere).
Nun habe ich dahingehend erweitert, dass ich auch die Modifizierungszeit mit übernehmen kann. (mit stat)
Ich möchte jetzt mit fstat die Zugriffsrechte aus der Quelldatei auslesen. (weil ich nur noch den File-Deskriptor übergeben möchte)
...
struct stat attribut;
...
if(fstat(f1, &attribut) < 0)
printf("copy: error in fstat()\n");
...
printf("attribut.st_mode = %o\n", attribut.st_mode);
Bis hier hin ist das kein Problem. Wenn ich die Oktalzahl ausgeben, dann erhalte ich beispielsweise 100655. Die letzten drei Ziffern geben mir die aktuell in der Quelldatei verwendeten Zugriffsrechte.
Aber ich verstehe nicht, wie ich diese jetzt in die Zieldatei übernehmen kann?!?
Ich weiß zwar, dass ich mit...
f2 = creat(argv[n+1], PERMS)
...f2 zum File-Deskriptor mache und PERMS (habe ich als Konstante festgelegt) bei mir die Zugriffsreche (z.B. 0777) beinhaltet, aber ich komme nicht drauf wie ich die von der Quelldatei ausgelesenen Zugriffsrechte in die Zieldatie übernehmen könnte.
THX im Vorraus!!
Gruß Sebastian